neo4j - 为 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() 但它没有点击...
谁能在这里指出我正确的方向?非常感谢!
解决方案
您可以使用all()
列表谓词来确保路径中的所有关系都遵循该谓词。这将在扩展期间进行评估,因此可能会产生更好的性能:
MATCH p=(n:Person {name:'Jennifer'})-[:KNOWS*]-(f)
WHERE all(rel in relationships(p) WHERE rel.since < 2000)
RETURN DISTINCT f
也就是说,Cypher 关注的是找到适合该模式的所有可能路径,并且当您对不同节点感兴趣时,这种方法并不总是一个很好的匹配,而不是不同的路径(尤其是当路径通过不同的路径回溯到先前访问过的节点时)关系)。
您可能需要考虑为可变长度扩展添加上限。
推荐阅读
- kubernetes - kubernetes:在 Pod 内访问 Ingress
- braintree - 如何从 PayPal 提示更新我的 APP 名称?
- python-3.x - python 3 如何使用 csv writer 编写 utf-8
- debugging - 按住右 Shift 时暂停自动热键脚本
- javascript - Javascript:如何在滚动时更改 div 内的图像?
- c# - C# 二叉搜索树给出不正确的多数元素
- uilabel - 在 UILabel SWIFT 末尾添加 Read More/Read Less
- google-sheets - 将多个范围导入单个工作表
- python - Python用通配符替换字符串
- c# - 在 GridView 中进行删除操作时出错