我想为集合中的每个关键字返回两个最相关的用户关键字。以下查询仅适用于一个关键字。
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
答案 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来做任何事情而不是改变操作。
希望这对你有用。