neo4j orientdb titan tinkerpop

neo4j - Tinkerpop Blueprints Vertex Query



orientdb titan (2)

  1. graph.getVertices() recorrerá todos los vértices y buscará los que tengan esa propiedad si no tiene activado el graph.getVertices() en la implementación de su gráfico. Si ya tiene datos y no puede activar el autoindicador, debe usar index = indexableGraph.getIndex() y luego index.get(''classname'', ''User'')

  2. Es posible realizar una query sobre varios objetos, pero sin detalles, es difícil de decir. Para Neo4j usan Lucene, lo que significa que query() tomará una consulta de lucene, como className:Users AND username:admin , pero no puedo hablar por los demás.

Sí, es bueno para jugar con esos DB, personalmente encontré que neo4j es el más fácil, y siempre que comprenda su estructura de licencias, no debería tener problemas para usarlas.

He estado investigando la pila de Tinkerpop por bastante tiempo. Creo que tengo una buena idea de lo que puede hacer y con qué bases de datos funciona bien. Tengo un par de bases de datos diferentes en las que estoy pensando en este momento, pero no he decidido definitivamente. Así que decidí escribir mi código exclusivamente en las interfaces y no tener en cuenta ninguna implementación en este momento. Fuera de las bases de datos que estoy viendo, implementan TransactionalGraph y KeyIndexableGraph . Creo que es lo suficientemente bueno para lo que necesito, pero solo tengo una pregunta.

Tengo diferentes ''clases'' de vértices. Usando Blueprints, creo que es mejor representable teniendo un campo en cada vértice que contenga el nombre de la clase. Al hacer eso, puedo hacer algo como graph.getVertices("classname", "User") y me daría todos los vértices de usuario. Y dado que la función getVertices especifica que una implementación debe hacer uso de índices, tengo la garantía de obtener una búsqueda rápida (si indexo ese campo).

Pero digamos que quería recuperar un vértice basado en dos propiedades. El vértice debe tener className=Users y username=admin . ¿Cuál es la mejor manera de encontrar ese único vértice? ¿Y es posible indexar ambas propiedades, aunque no todos los vértices tendrán un campo de username ?

FYI - Las bases de datos en las que estoy pensando actualmente son OrientDB, Neo4j y Titan, pero todavía no lo he decidido con certeza. También estoy planeando usar Gremlin si eso ayuda en absoluto.


Usar una "clase" o un "tipo" para vértices es una buena forma de segmentarlos. Obra:

graph.createKeyIndex("classname",Vertex.class); graph.getVertices("classname", "User");

es un patrón bastante común y generalmente debería generar una búsqueda rápida, aunque repetir un índice de decenas de millones de usuarios podría no ser tan bueno (si tiene la intención de hacer crecer un nombre de classname particular a un tamaño muy grande). Creo que eso te lleva a la segunda parte de tu pregunta, con respecto a hacer una búsqueda de dos propiedades.

Tomando su ejemplo en la superficie, la búsqueda de dos elementos sería algo así como (usando Gremlin):

g.V(''classname'',"User").has(''username'',''admin'')

Por lo tanto, reduce los vértices a solo vértices de "Usuario" con un índice de clave y luego los filtra para "admin". Pero, modelaría esto de manera diferente. Sería incluso menos costoso simplemente hacer:

graph.createKeyIndex("username",Vertex.class); graph.getVertices("username", "admin");

o en Gremlin:

g.V(''username'',''admin'')

Si conoce el nombre de usuario que desea, no hay una forma mejor / más rápida de modelar esto. Realmente solo necesitas el nombre de classname si quieres iterar sobre todos los vértices de "Usuario". Si solo desea encontrar uno (o un conjunto de vértices con ese username ), entonces la indexación de claves en esa propiedad es la mejor manera.

Incluso si no creo un índice de clave en él, todavía incluyo un type o una propiedad de nombre de classname en todos los vértices. Encuentro útil en operaciones globales en las que puede o no preocuparme por la velocidad, pero solo necesito una respuesta.