NEO4J:查找断开连接的节点

时间:2018-04-12 13:05:13

标签: neo4j cypher

我有这个样本数据

Sample data

使用示例查询

CREATE (a1:A {title: "a1"})
CREATE (a2:A {title: "a2"})
CREATE (a3:A {title: "a3"})

CREATE (b1:B {title: "b1"})
CREATE (b2:B {title: "b2"})

MATCH (a:A {title: "a1"}), (b:B {title: "b1"})
CREATE (a)-[r:LINKS]->(b)

MATCH (a:A), (b:B) return a,b

我想要实现的目标:

  1. 查找未连接到节点类型B的所有节点类型A(ans:a2,a3)
  2. 查找未连接到节点类型A(ans:b2)
  3. 的所有节点类型B.
  4. 这两个要求都应该是双向的,并且具有相同的查询模板。
  5. 我到达的地方

    让所有未连接到B的A:按预期获得a2和a3

    MATCH path=(a:A)-[r]-(b:B)
    WHERE (a)-[r]-(b)
    WITH collect(a) as al
    MATCH (c:A)
    WHERE not c IN al
    RETURN c
    

    获取所有断开连接的B,我得到b1和b2都不正确,并打印" al"透露该清单是空的

    MATCH path=(b:B)-[r]-(a:A)
    WHERE (b)-[r]-(a)
    WITH collect(b) as al
    MATCH (c:B)
    WHERE not c IN al
    RETURN c
    

    一些如何

    WHERE (b)-[r]-(a) **!=** WHERE (a)-[r]-(b)
    

    即使我的方向是双向的(未提及)

    如果我在第二个查询中将其更改为WHERE (a)-[r]-(b),那么它可以正常工作,但我想要一个通用的双向查询。

1 个答案:

答案 0 :(得分:3)

使用the path pattern in where

MATCH (a:A) WHERE NOT (a)-[:LINKS]-(:B)
RETURN a;

MATCH (b:B) WHERE NOT (b)-[:LINKS]-(:A)
RETURN b;

或合并为一个查询:

OPTIONAL MATCH (a:A) WHERE NOT (a)-[:LINKS]-(:B)
WITH collect(a) AS aNodes
OPTIONAL MATCH (b:B) WHERE NOT (b)-[:LINKS]-(:A)
WITH aNodes, 
     collect(b) AS bNodes
RETURN aNodes, bNodes

更新:为什么原始查询会产生错误的结果?

我认为这是一个错误。问题是,当您在where中使用变量作为关系时,该模式隐式使用从左到右的方向,即使未指定:

// Will return 0, but for test data should return 1
MATCH (b:B)-[r]-(a:A) WHERE (b)-[r]-(a)
RETURN COUNT(*);

// Will return 1
MATCH (b:B)-[r]-(a:A) WHERE (b)<-[r]-(a)
RETURN COUNT(*);

// Will return 1
MATCH (b:B)-[r]-(a:A) WHERE (b)--(a)
RETURN COUNT(*);

// Will return 1
MATCH (b:B)-[r]-(a:A) WHERE (a)-[r]-(b)
RETURN COUNT(*);
相关问题