使用 OrientDB,您尝试做的实际上非常简单,您似乎在考虑这个问题。
让我们创建您的示例:
V1 ---E1---> V2
---E2---> V3 --E3--> V2
在 OrientDB 中,您可以按如下方式执行此操作:
/* Create nodes */
CREATE CLASS Node EXTENDS V
CREATE PROPERTY Node.name STRING (MANDATORY TRUE)
CREATE VERTEX Node SET name = 'V1'
CREATE VERTEX Node SET name = 'V2'
CREATE VERTEX Node SET name = 'V3'
/* Create edges */
CREATE CLASS Link EXTENDS E
CREATE PROPERTY Link.name STRING (MANDATORY TRUE)
CREATE EDGE Link
FROM (SELECT FROM Node WHERE name = 'V1')
TO (SELECT FROM Node WHERE name = 'V2')
SET name = 'E1'
CREATE EDGE Link
FROM (SELECT FROM Node WHERE name = 'V1')
TO (SELECT FROM Node WHERE name = 'V3')
SET name = 'E2'
CREATE EDGE Link
FROM (SELECT FROM Node WHERE name = 'V3')
TO (SELECT FROM Node WHERE name = 'V2')
SET name = 'E3'
这将创建以下图表:

现在稍微解释一下如何在 OrientDB 中查询。假设您加载一个顶点:SELECT * FROM Node WHERE name = 'V1'
. 然后,要加载其他信息,请使用:
- 要加载所有传入顶点(跳过边):
in()
- 加载类的所有传入顶点
Link
(跳过边缘):in('Link')
- 要加载所有传入边:
inE()
- 加载类的所有传入边
Link
:inE('Link')
- 加载所有传出顶点(跳过边缘):
out()
- 加载类的所有传出顶点
Link
(跳过边缘):out('Link')
- 要加载所有传出边:
outE()
- 加载类的所有传出边
Link
:outE('Link')
因此,在您的情况下,您想要加载所有顶点及其传出边,所以我们这样做:
SELECT name, outE('Link') FROM Node
它加载顶点的名称和指向传出边的指针:

如果您想获得传出边的名称列表,我们只需执行以下操作:
SELECT name, outE('Link').name FROM Node
这使:

这正是您在问题中所要求的。如您所见,这在 OrientDB 中非常简单,您只需要意识到 OrientDB 比您想象的更智能 :)