neo4j-apoc - 为什么使用 apoc 而不是 cypher 进行简单查询?

标签 neo4j-apoc

我已经编写(并优化,使用“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/

相关文章:

neo4j - 为什么我的 apoc.refactor.cloneNodes 调用迭代并为图中的每个节点创建克隆?

csv - 如何将 apoc.load.csv 与 apoc.create.node 结合使用

json - 无法在 Neo4j 3.2.6 上调用 apoc.load.json

neo4j-apoc - 未找到 APOC 程序

neo4j - apoc.convert.fromJsonMap() 无法正确处理字符串中的转义字符

plugins - Neo4j安装APOC插件后重启失败

docker - Neo4j 和 Gephi Graph Streaming 插件 : Connection refused

Neo4j 安装 APOC 和图形算法 Neo.ClientError.Procedure.ProcedureRegistrationFailed

stored-procedures - Neo4J/APOC - 调用存储过程 `apoc.cypher.doIt` 后无法构建查询

java - Neo4J 与 APOC 和 MongoDB 驱动程序,限制从 Mongo 返回的记录