我有一份文件 - [:包含] - >关键字关系。我想获得具有指定关键字列表的所有文档。到目前为止,我设法做到了这一点:
Match (d:document)-[:CONTAINS]->(k1:keyword {keyword:"key1"})
WITH d,k1
MATCH (d)-[CONTAINS]->(k2:keyword {keyword:"key2"})
return d, k1, k2
上述查询返回包含" key1"的所有文档。和" key2"作为关键字。问题是必须根据我要查找的关键字数量修改查询。是否可以使用列表作为搜索参数并修改列表而不是查询本身?
答案 0 :(得分:2)
[增订]
这样的查询应该有效:
MATCH (d:document)-[:CONTAINS]->(k:keyword)
WHERE k.keyword IN {keywords}
RETURN d, COUNT(k) AS cnt
ORDER BY cnt DESC;
在此查询中,keywords
被假定为以parameter传递的关键字字符串的集合。我还假设CONTAINS
是一种关系类型,因此我添加了:
前缀。
为了获得更好的性能,您可以在keyword
节点标签的keyword
属性上创建索引。 (实际上,你应该给标签和属性赋予不同的名字......)。
CREATE INDEX ON :keyword(keyword);
在此之后,您可能必须更改原始查询以使Cypher计划程序使用索引:
MATCH (d:document)-[CONTAINS]->(k:keyword)
USING INDEX k:keyword(keyword)
WHERE k.keyword IN {keywords}
RETURN d, COUNT(k) AS cnt
ORDER BY cnt DESC;
答案 1 :(得分:0)
除了@cybersam建议的内容之外,此解决方案仅返回与所有关键字匹配的文档。
MATCH (d:document)-[:CONTAINS]->(k:keyword)
WITH d,k, ["key1", "key2"] AS input
WHERE k.keyword IN input
WITH d, input, COUNT(k) AS cnt
WHERE cnt=size(input)
return d, cnt;