为了测试以下工作查询,我将做一些假设:
- 单词节点具有标签
:Word 和name 属性。
- porsche、puma 等节点具有标签
:Item 和name property。
-
Item 节点与Word 节点有一个传出的CONNECT 关系
这将给出以下图表:
查询如下(为了模拟给定的单词作为参数,我在查询的开头添加了一个包含单词列表的 WITH)
WITH ["car","best","sports"] as words
MATCH (n:Word)<-[:CONNECT]-(i:Item)
WHERE n.name IN words
WITH i, count(*) as c, words
WHERE c = size(words)
RETURN i
并且将只返回porsche Item 节点。
逻辑解释
查询的逻辑是如果一个节点匹配所有给定的单词,在第一个MATCH中会找到3个模式,所以count(*) 在此处对于 porsche 节点的值为 3。
该值与words 列表中的size 进行比较。
更多解释
在WITH 语句中,有两个表达式:i 和count(*)。
i 不是聚合函数,因此它将充当分组键。
count(*) 是一个聚合函数,将在 i 存储桶上运行,计算聚合值。
例如,如果您想知道每个 Item 匹配了多少个单词,您可以简单地这样做:
WITH ["car","best","sports"] as words
MATCH (n:Word)<-[:CONNECT]-(i:Item) WHERE n.name IN words
RETURN i.name, count(*)
这将返回:
您可以看到porsche 匹配了3 个单词,即给定words 列表的size,然后您可以简单地将计数aggregation 中的3 与此size 进行比较。
为了全面了解聚合的工作原理,您可以参考手册:http://neo4j.com/docs/stable/query-aggregation.html
您可以在这里测试查询:
http://console.neo4j.org/r/e6bee0
如果您将单词作为参数传递,这将是相应的查询:
MATCH (n:Word)<-[:CONNECT]-(i:Item)
WHERE n.name IN {words}
WITH i, count(*) as c
WHERE c = size({words})
RETURN i
假设 {words} 是给定查询参数的名称