neo4j cypher循环为每个集合元素返回两个匹配项

时间:2014-05-14 17:15:35

标签: loops collections neo4j cypher

我想为集合中的每个关键字返回两个最相关的用户关键字。以下查询仅适用于一个关键字。

WITH
   'meeting' AS keyword
MATCH 
    (k:keywords)<-[r1:RELATED]-(u:users)
WHERE 
    k.keyword = keyword
    AND NOT u:deactivated
    AND NOT u.userid1 = 'administrator'
    AND NOT k:deleted
    AND r1.datedeleted = 0
    AND r1.datedeleted IS NOT NULL 
WITH
    DISTINCT u.userid1 AS user,
    r1.weight AS rel
ORDER BY 
    rel DESC
LIMIT 2
RETURN
    user
LIMIT 20

如何为每个集合元素创建一个与上面查询相同的循环? (例如下面的集合)

WITH 
['meeting', 'new', 'tool', 'training', 'it', 'process', 'server'] AS kw_my_channels

更准确地说,我需要一个密码循环来对从之前完成的查询返回的每个集合元素(关键字)执行查询(此处手动定义为kw_my_channels)。 问题是实现一个“for”循环,它为每个集合元素执行MATCH。在这种情况下,元素是与用户相关的关键字。该关系具有权重(该用户的关键字的相关性)。此权重显示用户使用关键字的频率(计数)。对于每个关键字,应找到权重最高的两个用户。

示例输出应如下所示:

Keyword | Users         | Weight
-------------------------------
meeting | user1, user2  | 80, 75
new     | user1, user4  | 40, 34
tool    | user5, user8  | 33, 22 

1 个答案:

答案 0 :(得分:1)

你可以尝试:

MATCH (k:keywords)<-[r1:RELATED]-(u:users)
WHERE k.keyword IN ['meeting', 'new', 'tool', 'training', 'it', 'process', 'server']
AND ...

<强>更新

你可以这样做吗?

WITH
    'meeting' AS keyword
MATCH 
    (k:keywords)<-[r1:RELATED]-(u:users)
WHERE 
    k.keyword = keyword
    AND NOT u:deactivated
    AND NOT u.userid1 = 'administrator'
    AND NOT k:deleted
    AND r1.datedeleted = 0
    AND r1.datedeleted IS NOT NULL 
WITH
    DISTINCT u.userid1 AS user,
    r1.weight AS rel
ORDER BY 
    u.userid1 DESC, rel DESC
RETURN
    user
LIMIT <# of distinct users * 2>

请注意删除&#34; LIMIT 2&#34;,更改&#34; ORDER BY&#34;和&#34; LIMIT&#34;在底部改变。当然,这假设每个关键字至少有两个不同的用户连接到它。对你来说这可能不是一件好事。

您是否能够以编程方式/动态插入&lt; #of distinct users * 2&gt;的值?进入查询?如果你可以使用类似&#34; LIMIT COUNT(用户)* 2&#34;那么它会很好。但这在Cypher中无效。

不幸的是,我不认为Cypher目前允许你使用FOREACH来做任何事情而不是改变操作。

希望这对你有用。