2017-08-14 75 views
0

参考此image,我有两类需要区分的neo4j图结构。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 

但这不工作的第二类。有人可以帮忙吗?

回答

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 

希望这有助于。

问候, 汤姆

附:第一个查询也是错误的,同样的原因...

UPDATE您的图像更新后...

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

应该这样做......

+0

谢谢汤姆,指出这件事。这就说得通了。 但是,(对不起),我之前添加的图像出现了问题。我已经更新了图像。 在新的场景中,我无法按照您指出的方式将它们分开。 –

+0

随着这些变化,你的查询变得更加没有意义。你实际上试图区分的是,如果C之间存在一条或多条路径(具有给定的ID,因此完全没有意义来计算它,总是只有一条!!!)和A,这是正确的吗? –

+0

添加了基于新映像的查询... –

0

您可以使用此作为你的数学查询,它匹配与它们之间的任何节点的任何关系。

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

我希望这有助于。

+0

请原谅我,但实际上这不会起作用,因为您指定的关系类型必须是什么,而B1不在那里......您无法以这种方式从C到达A(反之亦然)。 –

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)

注意:使用暗号,它确保了无节点在一个单一的模式匹配重新审视,所以你不需要检查一个不是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 
相关问题