我一直在研究Tinkerpop堆栈很长一段时间。我想我对它可以做什么以及它可以很好地工作的数据库有个很好的想法。我现在正在考虑一些不同的数据库,但还没有确定。所以我决定将我的代码纯粹写入接口,并且现在不考虑的任何实现。在我看到的数据库中,它们实现TransactionalGraph
和KeyIndexableGraph
。我认为这足够满足我需要的,但我只有一个问题。Tinkerpop Blueprints顶点查询
我有不同的'类'的顶点。使用蓝图,我认为最好通过在包含类名的每个顶点中包含一个字段来表示。这样做,我可以做类似graph.getVertices("classname", "User")
的东西,它会给我所有的用户顶点。由于getVertices
函数指定一个实现应该使用索引,我保证会得到一个快速查找(如果我索引该字段)。
但让我们说,我想基于两个属性检索顶点。顶点必须有className=Users
和username=admin
。寻找单个顶点的最佳方法是什么?是否有可能索引这两个属性,即使并非所有的顶点都有username
字段?我想要的数据库是OrientDB,Neo4j和Titan,但我还没确定。我目前也计划使用Gremlin,如果有帮助的话。
那么,正如你所说,查询有些实现特定(不幸)。我希望能够随时切换数据库,所以我只写了我自己的查询包装器。谢谢你的帮助。 – GJK 2013-04-22 02:08:39
是的,这很不幸,但这是大多数这些系统构建的方式,有些可能没有执行特定类型的查询的能力,因此他们将其留在了实现特定的位置。 – Nicholas 2013-04-22 02:12:09
说'graph.getVertices()'做线性扫描是不正确的。如果图形实现KeyIndexableGraph(以及所有提到的三个图),并且指定的密钥是作为密钥索引创建的密钥,则使用索引并避免线性扫描。 https://github.com/tinkerpop/blueprints/wiki/Graph-Indices#keyindexablegraph-and-fast-lookup-of-elements-by-keyvalue-pairs – 2013-04-22 11:02:08