在Neo4j中存储二进制对象

时间:2011-04-16 13:04:35

标签: neo4j

Neo4j似乎不允许我存储二进制对象。这是否意味着我必须将Neo4j与其他数据存储结合使用,例如文件系统。,Oracle等?

4 个答案:

答案 0 :(得分:35)

丹尼尔已经回答说可以在Neo4J中存储二进制对象。

但我建议你不要这样做。你不能对数据库中的二进制对象做任何有趣的事情你无法搜索它们。通过存储二进制对象,您将实现的唯一目标是 - 增加数据库的文件大小。请注意,Neo4J不能横向扩展。它没有自动分片。因此,如果你的数据库变得太大,你就会遇到麻烦。通过将二进制文件存储在文件系统或外部分布式键值存储(如riak,cassandra,hadoop等)中,可以使数据库保持较小,这有利于提高性能,备份和避免水平扩展问题。

答案 1 :(得分:10)

如果您在这里查看API:http://api.neo4j.org/1.2/org/neo4j/graphdb/PropertyContainer.html#setProperty(java.lang.String,java.lang.Object),您会看到允许使用字节数组。

使用字节数组可以存储二进制对象。在Oracle中存储二进制对象(使用Java)时,也会将数据加载为byte []。

答案 2 :(得分:6)

您可以将二进制对象存储为byte []或以字符串形式编码,但我建议将较大的(例如> 1,000字节)blob存储为单独的文件,并且只保留对数据库中文件的引用。 / p>

我们也在Structr(http://structr.org)中这样做。

答案 3 :(得分:1)

如上所述,这是非常不利的。

但是如果您决定这样做,可以在C#中执行此操作:

using Neo4jClient;
using Neo4jClient.Cypher;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Neo4JBlob
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                GraphClient client = new GraphClient(new Uri("http://localhost:7474/db/data"));
                client.Connect();

                byte[] image = File.ReadAllBytes("image.jpg");
                BlobNode blob = new BlobNode(){Blob = image, name = "An image: " + DateTime.Now.ToShortDateString()};

                client.Cypher.Create("(blob:Blob {category})").WithParam("category", blob).ExecuteWithoutResults();

                var res = client.Cypher.Match("(b:Blob)").Return<BlobNode>(b => b.As<BlobNode>()).Limit(1).Results;
                BlobNode BlobReturned = res.First();
                File.WriteAllBytes("image_returned.jpg", BlobReturned.Blob);

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
            Console.ReadKey();
        }

        class BlobNode
        {
            public byte[] Blob
            {
                get;
                set;
            }
            public string name
            {
                get;
                set;
            }
        }
    }    
}