Neo4j 似乎不允许我存储二进制对象。这是否意味着我必须将 Neo4j 与另一个数据存储(例如文件系统、Oracle 等)结合使用?
4 回答
Daniel 已经回答说可以在 Neo4J 中存储二进制对象。
但我建议你不要这样做。你不能对数据库中的二进制对象做任何有趣的事情。您无法搜索它们。您将通过存储二进制对象来实现的唯一一件事 - 增加数据库的文件大小。请注意,Neo4J 不能水平扩展。它没有自动分片。所以如果你的数据库变得太大,你就有麻烦了。通过将二进制文件存储在文件系统或外部分布式键值存储(如 riak、cassandra、hadoop 等)中,您可以保持数据库较小,这有利于性能、备份和避免水平扩展问题。
如果您在此处查看 API:http ://api.neo4j.org/1.2/org/neo4j/graphdb/PropertyContainer.html#setProperty (java.lang.String , java.lang.Object),您会看到字节数组被允许。
使用字节数组,您可以存储二进制对象。当您在 Oracle 中存储二进制对象(使用 Java)时,您也将数据加载为 byte[]。
您可以将二进制对象存储为 byte[] 或编码为字符串,但我建议将较大的(例如 > 1,000 字节)blob 存储为单独的文件,并且仅在数据库中保留对该文件的引用。
我们也在 Structr ( http://structr.org ) 中执行此操作。
如前所述,这样做是非常不利的。
但是,如果您决定这样做,您可以在 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;
}
}
}
}