【问题标题】:MATCH inside FOREACH -ish construct in cypher with Neo4j 2.0.1使用 Neo4j 2.0.1 在密码中匹配 FOREACH -ish 构造
【发布时间】: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)
)

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

【问题讨论】:

  • 投反对票的人能否解释一下原因?

标签: neo4j match cypher


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的指出。不是它。交易似乎是解决这个问题的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多