避免某些遍历

时间:2017-09-08 00:22:30

标签: neo4j orientdb arangodb

我有一个大约10M节点的数据库。这些节点中有9.9M是99%的查询中未使用的细节,但仍然需要1%的查询。对于那里99%的查询,如何判断图形数据库不会遍历特定节点,无论查询路径可能是什么卡?

向三个图表数据库添加标签的道歉,我还在评估哪个图表数据库是我们使用的正确数据库。

2 个答案:

答案 0 :(得分:1)

使用Neo4j时,您可以使用labels将节点分组。标签示例包括:UserProductAdmin等。此外,节点之间的relationships也可以输入。

可以在查询时使用这些构造来告诉数据库应该使用哪些节点标签/关系类型。

示例:

1 - 仅返回具有特定节点标签(:User)的节点:

MATCH (u:User)
RETURN u

2 - 返回带有:User标签而非Administrator标签的节点(因为节点可以有多个标签):

MATCH (u:User)
WHERE NOT u:Administrator
RETURN u

3 - 将:User:Product之间的模式与仅来自用户的类型:BUY的关系与u.id = 10的产品匹配,而不考虑用户:Administrator到。退回用户和相关产品。

MATCH (u:User)-[:BUY]->(p:Product)
WHERE u.id = 10 AND NOT u:Administrator
RETURN u, p

答案 1 :(得分:1)

使用OrientDB,您可以使用类层次结构,继承和多态查询,例如。你可以有两个班级,比如" Class1" (相关)和" Class2" (细节)两者共享一个超类,说" SuperClass"。

如果您只需要相关记录,则可以对子类执行查询:

 MATCH
    {class:Class1, as:p1} -TheEdgeClass-> {class:Class1, as:p2, while:($depth < 10)}
 RETURN $elements

或在超类上,如果您需要相关和详细信息:

 MATCH
    {class:SuperClass, as:p1} -TheEdgeClass-> {class:SuperClass, as:p2, while:($depth < 10)}
 RETURN $elements

第二个查询是多态的,这意味着它返回&#34; Class1&#34;的两个记录。和&#34; Class2&#34;,因为它们都扩展了#34; Superclass&#34;。

完全相同的边缘类,因此您可以拥有边的类层次结构,并使用多态也可以选择需要遍历的关系。

当然还有其他策略,例如。您可以根据属性为模式和过滤器添加WHERE条件,但是您将失去数据局部性的优势(不同类的记录存储在不同的文件中,因此当您基于单个类进行查询时,您有更多机会拥有热缓存和更少的磁盘访问。)

还要考虑类层次结构可以是多层深度(实际的类树)