Neo4j, похоже, не позволяет мне хранить двоичные объекты. Означает ли это, что я должен использовать Neo4j в соединении с другим хранилищем данных, например файловой системой., Oracle и т.д.
Сохранение двоичных объектов в Neo4j
Ответ 1
Даниэль уже ответил, что можно хранить двоичные объекты в Neo4J.
Но я предлагаю вам не делать этого. Вы не можете ничего делать с бинарными объектами в базе данных. Вы не можете их искать. Единственное, чего вы достигнете путем хранения двоичных объектов - увеличить размер файла вашей базы данных. Помните, Neo4J не масштабируется горизонтально. У него нет автоматического осколка. Поэтому, если ваш db становится слишком большим, у вас проблемы. Сохраняя двоичные файлы в файловой системе или внешнем распределенном хранилище ключей, таких как riak, cassandra, hadoop и т.д., Вы сохраняете свою базу данных маленькой, что хорошо для производительности, резервного копирования и предотвращения проблем с горизонтальным масштабированием.
Ответ 2
Если вы посмотрите в API здесь: http://api.neo4j.org/1.2/org/neo4j/graphdb/PropertyContainer.html#setProperty(java.lang.String, java.lang.Object), вы видите, что байт-массивы разрешены.
Используя байт-массивы, вы можете хранить свои двоичные объекты. Когда вы храните двоичные объекты (используя Java) в Oracle, вы также загружаете данные как byte [].
Ответ 3
Вы можете хранить двоичные объекты в виде байта [] или закодировать в String, но я бы рекомендовал хранить более крупные (например, > 1000 байт) капли в виде отдельных файлов и хранить ссылку только на файл в вашей базе данных.
Мы делаем это в Structr (http://structr.org).
Ответ 4
Как упоминалось, это очень невыгодно.
Однако, если вы решите сделать это, вы можете сделать это на С#:
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;
}
}
}
}