Neo4jでは、バイナリオブジェクトを保存できないようです。これは、ファイルシステム、Oracleなどの別のデータストアと組み合わせてNeo4jを使用する必要があることを意味しますか?
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)で、バイト配列がわかります。許可されます。
バイト配列を使用すると、バイナリオブジェクトを格納できます。バイナリオブジェクトを(Javaを使用して)Oracleに格納する場合、データも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;
}
}
}
}