Подтвердить что ты не робот

Сохранение двоичных объектов в Neo4j

Neo4j, похоже, не позволяет мне хранить двоичные объекты. Означает ли это, что я должен использовать Neo4j в соединении с другим хранилищем данных, например файловой системой., Oracle и т.д.

4b9b3361

Ответ 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;
            }
        }
    }    
}