Tinkerpop蓝图顶点查询

时间:2013-04-21 18:57:05

标签: neo4j orientdb titan tinkerpop

我一直在研究Tinkerpop堆栈。我想我很清楚它能做什么以及它适用的数据库。我现在有几个不同的数据库,但是还没有确定。所以我决定将我的代码纯粹写入接口,而不是立即考虑任何实现。在我正在查看的数据库中,他们实现了TransactionalGraphKeyIndexableGraph。我认为这对我所需要的已经足够了,但我只有一个问题。

我有不同的'类'顶点。使用蓝图,我相信通过在每个包含类名的顶点中包含一个字段来表示最佳。这样做,我可以做graph.getVertices("classname", "User")这样的事情,它会给我所有的用户顶点。由于getVertices函数指定实现应该使用索引,因此我保证快速查找(如果我索引该字段)。

但是,我想说我想根据两个属性检索一个顶点。顶点必须为className=Usersusername=admin。寻找单个顶点的最佳方法是什么?是否有可能对这两个属性进行索引,即使并非所有顶点都有username字段?

仅供参考 - 我目前正在考虑的数据库是OrientDB,Neo4j和Titan,但我尚未确定。我现在也计划使用Gremlin,如果这有帮助的话。

2 个答案:

答案 0 :(得分:4)

对顶点使用“类”或“类型”是分割它们的好方法。这样做的:

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

是一种非常常见的模式,通常应该产生快速查找,尽管迭代数千万用户的索引可能不是那么好(如果您打算将特定classname增长到非常大的大小)。我认为这导致了你的问题的第二部分,关于做两个属性查找。

在表面上举例,两个元素查找就像(使用Gremlin):

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

因此,您使用键索引将顶点缩小到“User”顶点,然后对“admin”进行过滤。但是,我的模型不同。简单地做它会更便宜:

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

或在Gremlin:

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

如果你知道你想要的用户名,那就没有更好/更快的方法来建模。如果要迭代所有“用户”顶点,则实际上只需要classname。如果您只想找到一个(或一组带有username的顶点),那么对该属性进行键索引是更好的方法。

即使我没有在其上创建密钥索引,我仍然在所有顶点上包含typeclassname属性。我发现它对全球运营有帮助,我可能会或可能不关心速度,但只需要一个答案。

答案 1 :(得分:3)

  1. graph.getVertices()将迭代所有顶点并查找具有该属性的顶点,如果您没有在图形实现中启用自动索引。如果您已有数据并且无法启用自动索引器,则应使用index = indexableGraph.getIndex()然后使用index.get('classname', 'User')

  2. 可以对多个对象执行query,但没有具体细节,很难说。对于Neo4j,他们使用Lucene,这意味着query()将采用lucene查询,例如className:Users AND username:admin,但我无法代替其他人。

  3. 这些数据库是否适合玩,我个人认为neo4j是最简单的,只要您了解他们的许可结构,您就不应该使用它们。