Neo4j似乎不允许我存储二进制对象。这是否意味着我必须将Neo4j与其他数据存储结合使用,例如文件系统。,Oracle等?
答案 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;
}
}
}
}