Neo4j用户定义的过程是在我的图形数据库中实现双链表的最佳方法吗?

Neo4j用户定义的过程是在我的图形数据库中实现双链表的最佳方法吗?,neo4j,cypher,Neo4j,Cypher,我正在实现一个使用Neo4j图形数据库的应用程序 我需要在我的图中实现双链表。在Cypher中执行此操作可以使用大型复杂查询来完成。我认为更好的方法是通过用户定义的过程实现双链表功能 这有意义吗?首先,请注意: 在Neo4j中,双链接列表买不到多少东西。您已经可以以相反的方向遍历关系,因此,如果这纯粹是为了遍历,那么根本不需要它,并且您不应该看到它的性能改进,除非您的数据模型中存在特殊情况 如果您确实需要知道如何创建双链接列表,请参见以下内容: 您可能需要APOC过程来实现这一点,这是一个接受节

我正在实现一个使用Neo4j图形数据库的应用程序

我需要在我的图中实现双链表。在Cypher中执行此操作可以使用大型复杂查询来完成。我认为更好的方法是通过用户定义的过程实现双链表功能


这有意义吗?

首先,请注意:

在Neo4j中,双链接列表买不到多少东西。您已经可以以相反的方向遍历关系,因此,如果这纯粹是为了遍历,那么根本不需要它,并且您不应该看到它的性能改进,除非您的数据模型中存在特殊情况

如果您确实需要知道如何创建双链接列表,请参见以下内容:

您可能需要APOC过程来实现这一点,这是一个接受节点集合的过程,允许您以链表样式在每个节点之间创建关系

不幸的是,APOC没有反转列表的函数,因此您可以再次运行APOC.nodes.link(),因此您必须按照相反的顺序查询相同的节点,或者在第二个关系中链接和合并的任意两个节点上进行匹配的查询

电影图表上的一个示例:

MATCH (m:Movie)
WITH m
ORDER BY m.released ASC
WITH COLLECT(m) as movies
CALL apoc.nodes.link(movies, 'Next')
MATCH (m:Movie)-[:Next]->(n:Movie)
MERGE (n)-[:Prev]->(m)

回答得很好,谢谢你给我的指向apoc的指针,这正是我要找的。问题:我没有看到任何向双链表中添加、删除或插入元素的方法,apoc中有这些方法吗?这里的链表在Neo4j中不是一个定义良好的“东西”,它只是一个节点和关系的排列,恰好是一个链表结构。您需要创建和重用查询,手动处理节点删除和插入,并相应地重新排列关系,如果可能发生并发更改,您可能需要锁定所涉及的节点(可以通过删除节点上不存在的属性来启用写锁来实现这一点)。由于这种复杂性,考虑用户定义的程序实际上是一个好主意。如果我在一个事务中实现列表操作操作,我需要真的做任何锁定吗?我想您还是会的,尽管我仍然是NeN4J并发故障排除/优化新手。APOC有一些功能,一旦您确定了要锁定的节点,它可能会使锁定本身更容易一些。