Neo4j Cypher查询:查找按关系属性筛选的两个节点之间的所有路径

Neo4j Cypher查询:查找按关系属性筛选的两个节点之间的所有路径,neo4j,cypher,Neo4j,Cypher,我有以下图形作为Neo4j图形数据库: activates (80 °F) (A)------------------------------------->(D) | \__ _/->^ | \__ activates

我有以下图形作为Neo4j图形数据库:

                           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;