Neo4j cypher查询搜索与特定节点有关系的节点以及与其他节点相同的关系

时间:2017-08-14 11:03:42

标签: neo4j cypher

参考这个image,我需要区分两类neo4j图结构。

我有这个逻辑来区分:

category 1 =>
Match (a:A)-[:A1]->(B)-[l1:B1]->(n1:C)
With n1, count(n1) as cnt, a Where cnt = 1 AND n1.id = "c"
Return a

category 2 =>
Match (a:A)-[:A1]->(B)-[l1:B1]->(n1:C)
With n1,count(n1) as cnt,a Where cnt>1 AND n1.id="c"
Return a

但这不适用于第二类。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

我认为你错过了关于Neo4j中聚合的观点,你不能有一个计数(n1),n1 ...显然总会返回" 1"作为伯爵。

试试这个,你会看到差异,聚合应该只在一个......

Match (a:A)-[:A1]->(B)-[l1:B1]->(n1:c)
WHERE n1.name = "c"
With count(n1) as cnt,a Where cnt>1
Return a

希望这有帮助。

此致 汤姆

P.S。出于同样的原因,您的第一个查询也是错误的...

更新图像后

更新 ...

MATCH (a:A)-[:A1]->(B)-[l1:B1]->(n1:C {id: "c"})
WITH a, count(*) AS cnt
WHERE cnt > 1
RETURN a, cnt;

应该这样做......

答案 1 :(得分:0)

您可以将其用作数学查询,这与它们之间的任何节点的任何关系都匹配。

Match (a:A)-[:A1*]->(n1:C)

我希望这会有所帮助。

答案 2 :(得分:0)

您可以使用TYPE(<relationship>)函数检查关系关系类型。所以MATCH (a)-[r1]-(b)-[r2]-(c) WHERE TYPE(r1) = TYPE(r2) RETURN *将匹配r1和r2是同一种关系的所有元组。

然后,您可以将关系方向指定为传入((a)-[r1]->(b)<-[r2]-(c))或传出((a)<-[r1]-(b)-[r2]->(c)

注意:使用Cypher,它确保在单个模式匹配中不会重新访问任何节点,因此您不需要检查a是否不是c(a <> c

// category 1 =>
MATCH ()-[r1]->(b:C)<-[r2]-()
WHERE TYPE(r1) = TYPE(r2)
WITH DISTINCT b
MATCH (a:A)-[*..25]->(b)
RETURN DISTINCT a

// category 1, known relation =>
MATCH ()-[r1:B1]->(b:C)<-[r2:B1]-()
WITH DISTINCT b
MATCH (a:A)-->()-->(b)
RETURN DISTINCT a

// category 2 =>
MATCH ()<-[r1]-(b:B)-[r2]->()
WHERE TYPE(r1) = TYPE(r2)
WITH DISTINCT b
MATCH (a:A)-[*..25]->(b)
RETURN DISTINCT a

// category 2, known relation =>
MATCH ()<-[r1:B1]-(b:B)-[r2:B1]->()
WITH DISTINCT b
MATCH (a:A)-->(b)
RETURN DISTINCT a