我一直在尝试为我一直在开发的个人 web 应用程序找出数据库后端。由于我在数据中需要的灵活性,关系数据库是不可行的,并且可能需要某种形式的文档存储。当我了解图形数据库时,我觉得这将是完美的。
但是,我遇到了一个问题:我需要能够以某种方式定义三向关系。我还没有决定数据库,但我一直在修补 Neo4j,所以我将使用 Cypher 来描述这个问题。
本质上,我从这个开始:
(a:N)-[r:E]->(b:N)
我需要的是一种将多个节点不仅与 a 和 b,而且与 r 相关联的方法。这些其他节点将存储关于所有 3 的不同信息。我决定可能只有两种方法来处理这个问题:将关系存储在自己的节点中或存储对包含信息的节点的引用并创建伪边. 我认为前者可能是一个更好的主意,可以为我们提供更像这样的东西:
(a:N)<-[:E]-(r:R)->[:E](b:N)
(s:S)->(a)
(s)->(r)
(s)->(b)
所以,现在,这导致了查询数据的问题。使用图形数据库的重点在于能够遍历图形。如果我做这样的事情,有没有办法在 N 类型的节点之间递归遍历?处理这个的正确方法是什么?我已经想到了几种不同的方法来处理这个问题,但它们都有自己的缺点。是否有特定的图形数据库本机支持这种类型的功能?
更新
使用原始代码,我能够使用以下代码递归遍历节点:
MATCH (a:N)-[:E*]->(b:N)
RETURN a,b
但是,一旦我将边缘拉出超边缘,我就无法弄清楚是否有一种方法可以递归地遍历图形到未确定的深度,因为我将交替使用节点类型。我正在寻找类似的东西
MATCH chain=((a:N)-[]->(r:R)-[]->(b:N))*
RETURN [nodes of type N along the chain]
如果答案只是在创建超边的同时在 a 和 b 之间创建一条边,那么我的问题就变成了:有没有一种好的方法可以确保边和超边一起被移除?基本上,两者都感觉像是一种变通方法,而不是实际的解决方案。