2011-04-16 73 views

回答

35

丹尼尔已经回答了,这是可能的二进制对象存储在Neo4j的。

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

+0

很好的启示。谢谢你的提醒。 – 2013-09-05 19:35:14

6

您可以存储二进制对象的字节[]或字符串编码,但我会建议存放较大(例如> 1000个字节)的斑点作为单独的文件,并只保留在你的数据库文件的引用。

我们Structr(http://structr.org)做到这一点。

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; 
      } 
     } 
    }  
}