neo4j中的简单查询 - 如果节点的度数为0,则不记录

时间:2017-02-05 13:38:09

标签: graph neo4j cypher

为了更好地理解neo中结果的格式:

节点ENSG00000180447没有邻居的简单查询:

MATCH (d:Target)-[r:Interaction]-(t:Target)
        where d.uid = 'ENSG00000180447'
        with d, count(t) as degree
        Return d, degree

(no changes, no records)

相反

MATCH (d:Target)
        where d.uid = 'ENSG00000180447'
        Return d # return the node

MATCH (d:Target)-[r:Interaction]-(t:Target)
        where d.uid = 'ENSG00000180447'
        with count(t) as degree
        Return degree # return 0

我想在同一个查询中获得返回的节点及其度。 第一个查询有什么问题?

2 个答案:

答案 0 :(得分:1)

" MATCH"正在寻找精确的模式匹配,并且找不到具有uid = 'ENSG00000180447'的节点。两种方式:

1)使用OPTIONAL MATCH

MATCH (d:Target)
        WHERE d.uid = 'ENSG00000180447'    
OPTIONAL MATCH (d)-[r:Interaction]-(t:Target)
RETURN d, COUNT(t) AS degree

2)使用零length paths

MATCH (d:Target)-[r:Interaction*0..1]-(t:Target)
        where d.uid = 'ENSG00000180447'
        with d, count(t) as degree
        Return d, degree-1

答案 1 :(得分:0)

正如stdob指出的那样,问题在于,当你执行MATCH时,它只返回匹配为真的行。因此,您要求使用类型:Interaction的关系在一个特定节点与:Target节点之间进行匹配。由于不存在这样的模式,因此不返回任何行。

对于简明查询,SIZE()函数可能是您最好的选择,您可以使用它来查找模式的出现。在这种情况下,我们可以使用它来查找该类型与目标节点的关系数:

MATCH (d:Target)
WHERE d.uid = 'ENSG00000180447'    
RETURN d, SIZE( (d)-[:Interaction]-(:Target) ) AS degree

编辑 - 解释为什么返回节点和计数的查询不返回任何行。

COUNT()是仅包含非聚合列(分组键)的上下文的聚合。 COUNT()本身没有其他上下文和分组键,它可以处理空值:

COUNT(null) = 0.

当我们执行MATCH时,我们建立行。如果MATCH没有找到任何匹配项,则不返回任何行:

MATCH (ele:PinkElephant)
RETURN ele
// (no changes, no records)

当我们尝试将其与聚合配对时,我们仍然不会获得任何行,因为聚合将针对每个可能的行运行,但是没有要执行的行:

MATCH (person:Person)-[:Halucinates]->(ele:PinkElephant)
RETURN ele, COUNT(person)
// (no changes, no records)

在这种情况下,你要求的行是:PinkElephant节点,并且对于每个节点,都要计算幻觉粉红色大象的人数。

但是没有:PinkElephant节点。 COUNT()没有行可供操作。我们无法显示任何行,因为没有节点可以填充它们。

即使图中有WERE:PinkElephant节点,如果没有关系:People节点,结果也是一样的。这场比赛什么都没找到,因为你要求的模式(人们产生幻觉的粉红色大象)不存在。没有:PinkElephants被幻觉:一个人,所以没有节点来填充ele列,所以没有行,如果没有行,你的COUNT()没有任何东西可以执行,也没有地方可以添加一个返回值。