为 GraphDB 中的可变路径搜索设置关系约束 属性

Set constraint on relationship property for variable-path search in GraphDB

我有一个 neo4j 图表,其结构类似于以下示例:

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

直接来自 neo4j 示例。

我想要做的是: 从一个节点的名称开始(在本例中为“Jennifer”)并找到所有节点,无论路径深度如何,这些节点源于初始节点但关系已知具有 属性 因为 < 2000 所以 Jennifer 可能在 2000 年之前就认识 Gary,而 Gary 在 2000 年之前就认识 Bill。而 Jennifer 在 2000 年之前就认识 Michelle (等等)

这就是我卡住的地方:

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

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

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

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

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

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

就是说,Cypher 关注的是找到符合模式的所有可能路径,当您对不同的节点而不是不同的路径感兴趣时(尤其是当路径回溯到以前通过不同的关系访问过节点)。

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