我已经编写(并优化,使用“PROFILE”)一个 Cypher 查询,该查询在给定节点的情况下回答节点的邻居。现在我找到了一个 apoc 过程 (apoc.neighbors.athop
),它似乎做同样的事情。
APOC版本更好吗?快点?更稳健?
当给定行为在常规 Cypher 中没有对应项时,我理解 APOC 的值(value)。在收集邻居的情况下,Cypher 似乎很容易:
MATCH (target:SomeLabel)
WITH target
MATCH (target)-[:ADJOINS]-(neighbor:SomeLabel)
WITH target, neighbor
据我了解,APOC 对应的是:
MATCH (target:SomeLabel)
WITH target
CALL apoc.neighbors.athop(target, "ADJOINS", 1)
YIELD node
RETURN node
为什么我会选择后者而不是前者?
最佳答案
OPTIONAL MATCH
子句应该达到相同的结果:
MATCH (target:SomeLabel)
OPTIONAL MATCH (target)-[:ADJOINS]-(neighbor:SomeLabel)
RETURN target, neighbor
根据documentation , OPTIONAL MATCH
是在 Neo4j 3.5 中引入的,所以在问这个问题的时候它可能不存在。
另一方面,APOC程序apoc.neighbours.athop/byhop/tohop
允许您传递关系模式,即类型和方向(传入、传出、双向)和距离,即两个节点之间的跳数,作为动态参数.这意味着您可以确定应用程序中的关系模式和长度,并将它们作为参数传递给 Neo4j 驱动程序。
apoc.neighbors.tohop
的示例:
MATCH (p:Person {name: "Emil"})
CALL apoc.neighbors.byhop(p, "KNOWS", 2)
YIELD nodes
RETURN nodes
此查询将遍历这些关系:
- (praveena)-[:FOLLOWS]-(joe)
- (praveena)-[:FOLLOWS]-(joe)-[:FOLLOWS]→(mark)
关于neo4j-apoc - 为什么使用 apoc 而不是 cypher 进行简单查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62092449/