13

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

4

4 回答 4

38

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

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

于 2011-04-18T19:51:25.223 回答
10

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

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

于 2011-04-17T12:51:14.933 回答
6

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

我们也在 Structr ( http://structr.org ) 中执行此操作。

于 2013-12-11T00:49:38.013 回答
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;
            }
        }
    }    
}
于 2014-01-08T10:42:27.103 回答