Neo4j - 迭代给定节点列表的公共节点

时间:2015-11-05 12:22:49

标签: neo4j cypher

我不知道在neo4j中迭代列表。请有人提出以下问题的想法。

实施例:  我在图中有一些节点。  然后,我将给出一些(总是变化的,这是用户输入)关键字来搜索这些单词共有的节点。在我的图表中,每个单词都是一个节点。

Ex: Input: [Best sports car]
output: connected nodes for Best are [samsung,porshe,ambassdor,protein,puma]
        connected nodes for sports are [cricket,racing,rugby,puma,porshe]
        connected nodes for car are [porshe,ambassdor,benz,audi]
Common nodes to all words are : [porshe]
Result is : porshe

我不知道迭代每个单词并存储匹配结果。请有人建议任何想法。

2 个答案:

答案 0 :(得分:3)

为了测试以下工作查询,我将做一些假设:

  • 单词节点具有标签:Wordname属性。
  • 保时捷,美洲狮等节点的标签为:Itemname property
  • Item个节点与CONNECT个节点之间存在Word个传出关系

这将给出以下图表:

enter image description here

查询如下(为了模拟给定的单词作为参数,我在查询的开头添加了包含单词列表的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项目节点。

逻辑解释

查询的逻辑是如果一个节点匹配所有给定的单词,那么在第一个MATCH中会找到3个模式,因此,count(*)节点的3值为porsche。 该值与size列表的words进行比较。

更多解释

WITH语句中,有两个表达式:icount(*)

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(*)

将返回此内容:

enter image description here

您可以看到porsche匹配3个字,即给定size列表的words,然后您只需比较来自计数的3 { {1}} aggregation

为了完全了解聚合的工作原理,您可以参考手册:http://neo4j.com/docs/stable/query-aggregation.html

您可以在此处测试查询:

http://console.neo4j.org/r/e6bee0

如果您将单词作为参数传递,那么这将是相应的查询:

size

假设{words}是给定查询参数的名称

答案 1 :(得分:1)

你是这样的人吗?

从请求的搜索开始收集单词。

将每个单词与图表匹配。

在列表中收集连接的单词。

with ['Best', 'sports', 'car'] as word_coll
unwind word_coll as word
match (:Word {name: word})--(conn_word:Word)
return word,collect(conn_word)