如何使用cypher查询检索具有多个关系的节点

时间:2013-03-01 13:37:01

标签: neo4j cypher

有人可以帮我这个。

我正在使用密码查询来获取具有“hive”或“hadoop”关系的节点,并且我能够获取节点。

但是当我试图获得与'hive'和'hadoop'都有关系的节点时,我无法获得节点。

这是我正在使用的查询

start n = node(*)match(n) - [r] - ()where type(r)=“Hadoop”and type(r)=“hive”return n,count(n);

此查询返回0行。

我的查询是错误的还是我需要以其他方式执行此操作。

提前致谢。

Gouse

4 个答案:

答案 0 :(得分:3)

这应该这样做:

start n=node(*) match ()-[:Hadoop]-(n)-[:hive]-() return n,count(n)

答案 1 :(得分:2)

我认为你的查询应该是:

  

start n = node(*)match(n) - [r1] - (),(n) - [r2] - ()其中type(r1)=“Hadoop”   并键入(r2)=“hive”返回n,count(n);

答案 2 :(得分:1)

你可以像这样实现它

match (n)-[r:Hadoop|hive]-()
return n,count(n);

它将为您提供您所期望的。匹配条件更好,而不是在where子句中。

答案 3 :(得分:0)

首先,您的查询没有结果的原因是因为部分where type(r)="Hadoop" and type(r)="hive"表示您正在寻找r的实例,其中r.type =“Hadoop”和“hive”同时发生。由于r.type在任何时候只能有一个值,因此它不可能同时等于Hadoop和Hive;所以声明可以在逻辑上简化为“where false”或基本上放弃所有匹配。

如果您要查找具有任何关系的所有节点,则Satish Shinde's answer是指定它的正确方法

match (n)-[:Hadoop|hive]-()
return n,count(n);

或者,方向

match (n)-[:Hadoop|hive]->()
return n,count(n);

如果您需要同时出现,则需要匹配两个单独的关系边缘,如下所示

match ()-[:hive]-(n)-[:Hadoop]-()
return n,count(n);

或者,方向

match ()<-[:hive]-(n)-[:Hadoop]->()
return n,count(n);

为了完整起见,如果你想检查两者是否存在,你可以使用remigio's answer

start n=node(*) match ()-[r2]-(n)-[r1]-() where type(r1)="Hadoop" and type(r2)="hive" return n,count(n);