2015-11-05 120 views
1

我不知道在neo4j中迭代列表。请有人建议下面的问题的想法。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 

我对迭代每个单词和存储匹配结果没有任何想法。请有人建议任何想法。

回答

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 Item节点。

逻辑解释

查询的逻辑,是如果节点的匹配所有给出话,就会有3种模式,以它在第一MATCH发现,所以count(*)将有此处为porsche节点的值为3。 将此值与words列表的size进行比较。

更多的解释

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个单词,这是给定words列表的size,那么您可以简单地比较的到这个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}是给的名字n查询参数

+0

这有点难理解。你能否详细说明查询。 –

+0

有窍门。很有帮助。谢谢。 –

+0

我添加了更多信息 –

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)