为什么这个查询会返回相同答案的三行

时间:2014-05-02 15:07:51

标签: neo4j cypher

无法理解为什么此查询会返回此结果 节点(A)仅在我的图表中存在一次,但在结果中显示三次 我想要的是每个外部节点+(A)节点的总数 - 在这种情况下,该值应为4.

以下是控制台图表的链接:http://console.neo4j.org/r/btmdfi

MATCH (n)-[r]-(m)
WHERE n.label = 'A'
WITH n, m, collect (Distinct m.size) as sizes, collect (Distinct m.weight) as weights, collect (Distinct m.color) as colors
WITH n, sizes, weights, colors, count ( m.size) as size_ct, count ( m.weight) as weight_ct, count ( m.color) as color_ct
WITH n, sizes, weights, colors, sum( size_ct + weight_ct + color_ct) as count_n
RETURN n.label

我想在查询中添加第二部分来搜索也有标签的其他节点,然后比较节点类型(m.weight,m.size,m.color)和这些类型的数量到(A)节点的值。 所以输出看起来像:

n.label  count_match(r) m.weight m.size m.color 
A           4             heavy    small  red 
B           2/4           light    large  red 
C           3/4           light    small  red 

3 个答案:

答案 0 :(得分:1)

在您的图表中(根据您的控制台),您有三个来自“A”的关系,因此,您的查询将匹配三个路径。

我不确定“外部节点”是什么意思。

答案 1 :(得分:1)

查询:

MATCH (n:label)-[r]->(m)
WHERE n.label = 'A'
RETURN n.label, count(r)

将返回一行,其中包含' A'在第一列和第二列中的数字3中,对于连接到' A'的三个节点。如果您希望通过'像这样的效果,那么你不能像上面那样在同一个WITH语句中返回n和m。

看到链接的WITH语句,它们之间没有任何内容也有点不寻常。不知道你在那里计划什么。或许对你想要完整查询(包括所有的collect()和WITH)的更多解释是打算做的吗?

如下的查询:

MATCH (n:label)-[r]->(m)
WHERE n.label = 'A'
RETURN n.label, count(r),
    collect(m.weight), collect(m.size), collect(m.color)

提供更多信息。也许这正朝着你追求的目标前进?

答案 2 :(得分:0)

您的查询返回n.labeln.label在查询的早期定义为“A”。这应该很明显为什么它会三次返回'A'。

让我们分解一个只返回4的简单查询:

MATCH (n)-[r]-(m)
WHERE n.label = 'A'
RETURN count(m) + 1

这里我们要求Neo4j返回连接到A(n)的所有节点(m)。然后,我们计算它们并添加1以包含A节点。此查询返回节点:size 4:color red:weight 4

这就是你想要的吗?正如其他人发布的那样,目前尚不清楚“外部节点”是什么意思。如果您可以命名或提供“外部节点”列表,我可以修改我的示例查询以检索您想要的信息。