首页 > 解决方案 > 为 GraphDB 中的变量路径搜索设置关系属性约束

问题描述

我有一个与以下示例结构相似的 neo4j 图:

MATCH (n:Person)-[k:KNOWS]->(f)
WHERE k.since < 2000
RETURN f.name, f.age, f.email

这直接来自 neo4j 示例。

我要做的是: 从一个节点的名称开始(在本例中为“Jennifer”)并找到所有节点,无论路径深度如何,它们都源于初始节点,但关系 KNOWS 自 < 2000 所以詹妮弗可能在 2000 年之前就认识加里,而在 2000 年之前她也认识比尔。詹妮弗在 2000 年之前就认识米歇尔(等等

这是我卡住的地方:

MATCH p=(n:Person {name:'Jennifer'})-[:KNOWS*]-(f)
RETURN [k IN p WHERE k.since < 2000]

如果我使用 :KNOWS* 运行任何查询,它就会永远挂起,即使对于 21 个节点和 840 个关系的相对较小的数据库也是如此。

我想我需要以某种方式使用 WITH REDUCE() 但它没有点击...

谁能在这里指出我正确的方向?非常感谢!

标签: neo4j

解决方案


您可以使用all()列表谓词来确保路径中的所有关系都遵循该谓词。这将在扩展期间进行评估,因此可能会产生更好的性能:

MATCH p=(n:Person {name:'Jennifer'})-[:KNOWS*]-(f)
WHERE all(rel in relationships(p) WHERE rel.since < 2000)
RETURN DISTINCT f

也就是说,Cypher 关注的是找到适合该模式的所有可能路径,并且当您对不同节点感兴趣时,这种方法并不总是一个很好的匹配,而不是不同的路径(尤其是当路径通过不同的路径回溯到先前访问过的节点时)关系)。

您可能需要考虑为可变长度扩展添加上限。


推荐阅读