我有一个大约10M节点的数据库。这些节点中有9.9M是99%的查询中未使用的细节,但仍然需要1%的查询。对于那里99%的查询,如何判断图形数据库不会遍历特定节点,无论查询路径可能是什么卡?
向三个图表数据库添加标签的道歉,我还在评估哪个图表数据库是我们使用的正确数据库。
答案 0 :(得分:1)
使用Neo4j时,您可以使用labels将节点分组。标签示例包括:User
,Product
,Admin
等。此外,节点之间的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条件,但是您将失去数据局部性的优势(不同类的记录存储在不同的文件中,因此当您基于单个类进行查询时,您有更多机会拥有热缓存和更少的磁盘访问。)
还要考虑类层次结构可以是多层深度(实际的类树)