在Neo4j中存储二进制对象

在Neo4j中存储二进制对象,neo4j,Neo4j,Neo4j似乎不允许我存储二进制对象。这是否意味着我必须将Neo4j与另一个数据存储(如文件系统、Oracle等)结合使用?如果您查看此处的API:,java.lang.Object),您会看到允许使用字节数组 使用字节数组可以存储二进制对象。在Oracle中存储二进制对象(使用Java)时,也会将数据作为字节[]加载 Daniel已经回答说可以在Neo4J中存储二进制对象 但我建议你不要这样做。对于数据库中的二进制对象,您不能做任何有趣的事情。你不能搜索它们。通过存储二进制对象,您将实现的唯一

Neo4j似乎不允许我存储二进制对象。这是否意味着我必须将Neo4j与另一个数据存储(如文件系统、Oracle等)结合使用?

如果您查看此处的API:,java.lang.Object),您会看到允许使用字节数组


使用字节数组可以存储二进制对象。在Oracle中存储二进制对象(使用Java)时,也会将数据作为字节[]加载

Daniel已经回答说可以在Neo4J中存储二进制对象


但我建议你不要这样做。对于数据库中的二进制对象,您不能做任何有趣的事情。你不能搜索它们。通过存储二进制对象,您将实现的唯一目标是增加数据库的文件大小。请注意,Neo4J不能水平伸缩。它没有自动切分功能。因此,如果你的数据库增长太大,你就有麻烦了。通过在文件系统或外部分布式键值存储(如riak、cassandra、hadoop等)中存储二进制文件,您可以使数据库保持小型,这有利于性能、备份和避免水平缩放问题。

您可以将二进制对象存储为byte[]或编码为字符串,但我建议存储较大的二进制对象(例如>1000字节)blob作为单独的文件,并且只在数据库中保留对该文件的引用


我们也在struct()中这样做。

如前所述,这样做非常不利

但是,如果您决定这样做,您可以在C#中这样做:

使用Neo4jClient;
使用Neo4jClient.Cypher;
使用制度;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间Neo4JBlob
{
班级计划
{
静态void Main(字符串[]参数)
{
尝试
{
GraphClient=新GraphClient(新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()};
Create(((blob:blob{category})”).WithParam(“category”,blob.ExecuteWithoutResults();
var res=client.Cypher.Match(((b:Blob)”).Return(b=>b.As()).Limit(1).结果;
BlobNode blobreturn=res.First();
writealBytes(“image_returned.jpg”,blobretured.Blob);
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
控制台写入线(例如StackTrace);
}
Console.ReadKey();
}
类BlobNode
{
公共字节[]Blob
{
得到;
设置
}
公共字符串名
{
得到;
设置
}
}
}    
}

洞察力强。感谢您的警告。
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;
            }
        }
    }    
}