2011-04-16 12 views
13

Parece que Neo4j no me permite almacenar objetos binarios. ¿Esto significa que debo usar Neo4j en conjunción con otro almacén de datos, como el sistema de archivos., Oracle, etc.?Almacenar objetos binarios en Neo4j

Respuesta

35

Daniel ya respondió que es posible almacenar objetos binarios en Neo4J.

Pero le sugiero que no lo haga. No puede hacer nada interesante con objetos binarios en la base de datos. No puedes buscarlos. Lo único que logrará al almacenar objetos binarios: aumentará el tamaño del archivo de su base de datos. Eso sí, Neo4J no es escalable horizontalmente. No tiene sharding automático. Entonces, si tu DB crece demasiado, estás en problemas. Al almacenar archivos binarios en un sistema de archivos o en un almacén de valores-clave externos distribuidos como riak, cassandra, hadoop, etc., mantendrá su base de datos pequeña, lo que es bueno para el rendimiento, las copias de seguridad y evitar los problemas de escala horizontal.

+0

buena perspectiva. Gracias por la advertencia. –

6

Puede almacenar objetos binarios como bytes [] o codificados en String, pero recomendaría almacenar blobs más grandes (por ejemplo> 1,000 bytes) como archivos separados, y solo mantener una referencia al archivo en su base de datos.

Hacemos esto en Structr (http://structr.org) también.

1

Como se mencionó, hacer esto es altamente desventajoso.

Sin embargo, si decide hacerlo, puede hacerlo de esta manera en 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; 
      } 
     } 
    }  
} 
Cuestiones relacionadas