Neo4j - 获取包含子项列表的节点

时间:2017-01-18 00:22:50

标签: list search neo4j cypher

我有一份文件 - [:包含] - >关键字关系。我想获得具有指定关键字列表的所有文档。到目前为止,我设法做到了这一点:

Match (d:document)-[:CONTAINS]->(k1:keyword {keyword:"key1"})
WITH d,k1
MATCH (d)-[CONTAINS]->(k2:keyword {keyword:"key2"})
return d, k1, k2

上述查询返回包含" key1"的所有文档。和" key2"作为关键字。问题是必须根据我要查找的关键字数量修改查询。是否可以使用列表作为搜索参数并修改列表而不是查询本身?

2 个答案:

答案 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;