Graph Neo4j:如何查找连接到具有特定属性的0节点或具有属性集的所有节点的所有节点
假设我有一个有向图,其中包含类型a和B的节点。类型a的节点可以连接到类型a或B的节点,类型B的节点没有传出连接 此外,节点B具有Graph Neo4j:如何查找连接到具有特定属性的0节点或具有属性集的所有节点的所有节点,graph,neo4j,cypher,Graph,Neo4j,Cypher,假设我有一个有向图,其中包含类型a和B的节点。类型a的节点可以连接到类型a或B的节点,类型B的节点没有传出连接 此外,节点B具有布尔属性。我需要找到以下所有节点: 与节点B没有直接或间接连接 如果节点A连接到至少1个节点B,则仅当所有连接的节点B的属性设置为true时,才应返回该节点 或者换句话说,我需要找到所有A,它们没有连接到属性设置为false的任何B 我试着用query来做: OPTIONAL MATCH (a:A)-[*]->(b:B) WITH a,b, collect(b)
布尔属性。我需要找到以下所有节点:
与节点B没有直接或间接连接
如果节点A连接到至少1个节点B,则仅当所有连接的节点B的属性设置为true时,才应返回该节点
或者换句话说,我需要找到所有A,它们没有连接到属性设置为false的任何B
我试着用query来做:
OPTIONAL MATCH (a:A)-[*]->(b:B)
WITH a,b, collect(b) as bc
WITH a,b,COLLECT(bc) AS coll
UNWIND coll as unwinded
WITH a,b,unwinded
WHERE ALL (x IN unwinded WHERE x.prop = true)
return a
但如果它们至少有1个b且prop=true
,则返回A。我做错了什么
谢谢大家! 这有用吗
MATCH (a:A)
OPTIONAL MATCH (a)-[*]->(b:B {prop: false})
WITH a, b
WHERE b IS NULL
RETURN a
这行吗
MATCH (a:A)
OPTIONAL MATCH (a)-[*]->(b:B {prop: false})
WITH a, b
WHERE b IS NULL
RETURN a
这将返回所有没有连接的B
节点的A
节点,并返回一个假prop
:
MATCH (a:A)
OPTIONAL MATCH (a)-[*]->(b:B { prop: false })
WITH a, COLLECT(b) AS bs
WHERE SIZE(bs)= 0
RETURN a;
下面显示这个查询
[更新]
正如@InverseFalcon所建议的,上述查询可以大大简化:
MATCH (a:A)
WHERE NOT (a)-[*]->(:B {prop:false})
RETURN a;
这将返回所有没有连接的B
节点的A
节点,并返回一个假prop
:
MATCH (a:A)
OPTIONAL MATCH (a)-[*]->(b:B { prop: false })
WITH a, COLLECT(b) AS bs
WHERE SIZE(bs)= 0
RETURN a;
下面显示这个查询
[更新]
正如@InverseFalcon所建议的,上述查询可以大大简化:
MATCH (a:A)
WHERE NOT (a)-[*]->(:B {prop:false})
RETURN a;
非常感谢。我想知道我的问题出在哪里。看起来我不完全理解WHERE ALL()是如何工作的注意,应该可以将其缩短一点:匹配(a:a)WHERE NOT(a)-[*]->(:B{prop:false})返回一个
@InverseFalcon另一个很好的建议。谢谢,谢谢!!!我想知道我的问题出在哪里。看起来我不完全理解WHERE ALL()是如何工作的注意,应该可以将其缩短一点:匹配(a:a)WHERE NOT(a)-[*]->(:B{prop:false})返回一个
@InverseFalcon另一个很好的建议。谢谢。此查询返回所有A
节点。WHERE
子句只过滤第二个(可选)匹配项
,不删除第一个匹配项找到的A
节点。再次感谢,cyphersam!;)我认为我刚才添加的和应该可以解决这个问题。这是一个微妙的解决方案,可能比我的更有效。这个查询返回所有A
节点。WHERE
子句只过滤第二个(可选)匹配项
,不删除第一个匹配项找到的A
节点。再次感谢,cyphersam!;)我认为我刚才添加的和应该可以解决这个问题。这是一个微妙的解决方案,可能比我的更有效。相当整洁。