我有一个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)
)
问题是:这可以在密码中完成吗?
答案 0 :(得分:3)
您似乎正在尝试使用Cypher在整个图形上执行迭代算法。这就是所谓的“图形全局查询”。从Neo4j 2.0.1开始,Cypher中的图形全局查询并不容易。如果您运行一个遍历每个文档的消息队列来进行排名,那会更好。
这可以使用Neo4j Transactional Endpoint以高效率完成。您可以将多个Cypher语句发布到事务上下文中。
有关详细信息,请参阅参考文档:
http://docs.neo4j.org/chunked/milestone/rest-api-transactional.html