我不知道在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
我不知道迭代每个单词并存储匹配结果。请有人建议任何想法。
答案 0 :(得分:3)
为了测试以下工作查询,我将做一些假设:
:Word
和name
属性。:Item
和name property
。Item
个节点与CONNECT
个节点之间存在Word
个传出关系这将给出以下图表:
查询如下(为了模拟给定的单词作为参数,我在查询的开头添加了包含单词列表的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
语句中,有两个表达式: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个字,即给定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)