Neo4j Cypher查询:查找按关系属性筛选的两个节点之间的所有路径
我有以下图形作为Neo4j图形数据库:Neo4j Cypher查询:查找按关系属性筛选的两个节点之间的所有路径,neo4j,cypher,Neo4j,Cypher,我有以下图形作为Neo4j图形数据库: activates (80 °F) (A)------------------------------------->(D) | \__ _/->^ | \__ activates
activates
(80 °F)
(A)------------------------------------->(D)
| \__ _/->^
| \__ activates __/ |
| \__(50 °F) __/ |
| \__ __/ |
| \__ __/ |
activates | \__ __/ |
(50 °F) | \/ | activates
| __/\__ | (50 °F)
| activates __/ \__ |
| (60 °F)__/ \__ |
| __/ \__ |
| __/ \__ |
| __/ \_ |
v / \->|
(B)------------------------------------->(C)
activates
(50 °F)
每个关系都有一个属性,表示“激活”操作所需的温度
我需要检索(A)和(D)之间的所有可用路径,其中沿路径的温度为50°F
输出应包括:
A -[:activates{temperature:'50'}]-> B -[:activates{temperature:'50'}]-> C -[:activates{temperature:'50'}]-> D
A -[:activates{temperature:'50'}]-> C -[:activates{temperature:'50'}]-> D
但不是
如何编写所需的密码查询
提前谢谢
编辑1:为了更加清晰,我添加了另一个对角线关系(B-[:激活{temperature:'80'}]->D)
编辑2:我需要检索(A)和(D)之间的所有可用路径其中沿路径的温度相同,即:A->B->C->D,A->C->D,A->D
START a=node({A}), d=node({D})
MATCH p=a-[r:ACTIVATES*..]-d
WHERE has(r.temperature) and r.temperature='50'
RETURN p;
用节点ID替换曲线括号(A,D)中的值
更新:
使用功能
到目前为止你试过什么?这可以用cypher实现,但我们希望看到您已经尝试了一些方法,而不是直接给出解决方案。我的想法是检索所有可能的路径,然后使用Java代码仅选择统一的路径。但我认为Cypher查询在这种情况下会有所帮助。只要在console.neo4j.org上做一个示例图就可以了?下面是一个示例。我对它进行了修改,以便更准确地描述我的场景。简而言之,我需要找到从A到D的所有路径,其中匹配路径的所有部分(关系)都应该具有相同的属性。结果应该包括A->B->D(沿路径的温度=50)和-A->C->D(沿路径的温度=60)。请参阅我对ulkas的评论中的“巴士场景”(如下)。谢谢ulkas。您的答案完全符合上述情况。然而,我意识到场景应该更复杂:一条路径中的所有关系都应该具有公共属性(temp=50或60或…),不管它们是什么。它类似于总线路径,您可以通过路径从A到B,每个路径仅由一条总线使用——不管它是什么。如果您认为我需要将修改后的场景作为新问题发布,我很乐意在这里接受您的回答。;)这很酷,我想知道它是否可以扩展成更一般的逻辑。显然,它非常适合路径/弧的问题,但更一般的逻辑(沿着prolog的思路)是这样的,如果我有一个“是”关系,如果一个节点是另一个,那么它“有”其他节点的所有边,所以边(a,p,b):-(a)-[:p]->(b)边(a,p,b):-(a)-[:is*]->(x)和(x)-[:p]>(b)但这当然可以在理论上变得更加普遍。我不知道我想说的是否清楚。。。对于neo4j 3.4,我今天不太善于沟通,我使用了以下方法:匹配p=(a:Database)-[r:PARENTS.*.]-(d:Database),其中a.membershipID='H1001'和d.membershipID=“H12412”返回p;
START a=node({A}), d=node({D})
MATCH p=a-[r:ACTIVATES*..]-d
WHERE has(r.temperature) and r.temperature='50'
RETURN p;
START a=node(1), d=node(4)
MATCH p=a-[r:ACTIVATES*..]-d
WITH head(relationships(p))as r1,p //since the pointer r is a collection of rels we must declare a single relationship pointer
WHERE all(r2 in relationships(p)
where r2.temperature=r1.temperature)
return p;