【发布时间】:2014-03-10 18:40:34
【问题描述】:
我有一个 Neo4j 2.0.1。具有 10k 文档和 12k 术语的数据存储,通过 12M rels 相互关联,例如
(:doc)-[:HAS_TERM]->(:term)
有时我需要根据常用术语的数量找到类似的文档。对于特定文档,使用 cypher 检索 3 个最相似的文档:
MATCH (d1:doc)-[:HAS_TERM]->(t)<-[:HAS_TERM]-(d2:doc)
WHERE d1.id = 'ABC123' AND d2 <> d1
WITH d1,d2,count(t) as commonterms
MATCH (d1)-[t1:HAS_TERM]->()
RETURN d2.id,(commonterms*100/count(t1)) AS commontermsperc
ORDER BY commontermsperc desc
LIMIT 3
工作正常,但价格昂贵。由于链接到文档的术语不会经常更改,因此我想在相似的文档之间创建额外的关系,例如
(:doc)-[:IS_SIMILAR_TO]->(:doc)
最好在定期执行的密码中。这种结构的东西(不工作的密码,因为它不允许在 FOREACH 内进行 MATCH
MATCH (d:doc)
WITH COLLECT(d) AS ds
FOREACH (d1 in ds |
MATCH (d1)-[:HAS_TERM]->(t)<-[:HAS_TERM]-(d2)
WHERE d1.id = 'ABC123' AND d2 <> d1
WITH d1,d2,count(t) as commonterms
MATCH (d1)-[t1:HAS_TERM]->()
WITH d1,d2,(commonterms*100/count(t1)) AS commontermsperc ORDER BY commontermsperc desc LIMIT 3
CREATE (d1)-[:IS_SIMILAR_TO {score:commontermsperc]->(d2)
)
问题是:这可以用密码完成吗?
【问题讨论】:
-
投反对票的人能否解释一下原因?