我有这个样本数据
使用示例查询
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
我想要实现的目标:
我到达的地方
让所有未连接到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)
,那么它可以正常工作,但我想要一个通用的双向查询。
答案 0 :(得分:3)
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(*);