在Neo4J中,如何匹配所有与特定节点相关的节点相关的所有节点?

时间:2019-08-19 10:48:27

标签: neo4j cypher

假设我有红色,蓝色和绿色节点(RBG),并且这些关系看起来像这样:

Graph showing R -> B <- C

如您所见,R指向B,而G也指向B。我想匹配所有R节点,它们指向的所有B节点也都与特定的C节点相关。我该怎么办?

您可以通过运行以下命令在自己的数据库上进行设置:

CREATE 
    (R1:Test_R),
    (B1:Test_B),
    (G:Test_G),
    (R2:Test_R),
    (B2:Test_B),
    (R1)-[:TEST_LINK]->(B1),
    (R1)-[:TEST_LINK]->(B2),
    (R2)-[:TEST_LINK]->(B1),
    (G)-[:TEST_LINK]->(B1)
RETURN
    R1, R2, B1, B2, G

然后您可以通过运行以下命令来查询它们:

MATCH
    (R:Test_R)-[:TEST_LINK]->(B:Test_B)
OPTIONAL MATCH
    (B)<-[:TEST_LINK]-(G:Test_G)
RETURN
    R,B,G

1 个答案:

答案 0 :(得分:0)

您可以使用类似以下内容的查询来做到这一点:

MATCH
    (R:Test_R)-[:TEST_LINK]->(B:Test_B)
WITH
    {R: R, B: COLLECT(B) } AS d
MATCH
    (G:Test_G)
WHERE   
    ID(G) = 5770 // Match our specific G node
    AND ALL(b IN d.B WHERE (b)<-[:TEST_LINK]-(G) )
RETURN d.R

如果list中的所有项目对于指定的谓词都返回true,则ALL函数将返回true:

ALL(<variable> IN <list> WHERE <predicate)