在使用Neo4j 2.0.1的密码中的FOREACH -ish构造内部匹配

时间:2014-03-10 18:40:34

标签: neo4j match cypher

我有一个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)
)

问题是:这可以在密码中完成吗?

1 个答案:

答案 0 :(得分:3)

您似乎正在尝试使用Cypher在整个图形上执行迭代算法。这就是所谓的“图形全局查询”。从Neo4j 2.0.1开始,Cypher中的图形全局查询并不容易。如果您运行一个遍历每个文档的消息队列来进行排名,那会更好。

这可以使用Neo4j Transactional Endpoint以高效率完成。您可以将多个Cypher语句发布到事务上下文中。

有关详细信息,请参阅参考文档:

http://docs.neo4j.org/chunked/milestone/rest-api-transactional.html