2

在 OrientDb 图形数据库中,我试图获取有关顶点、边对的一些信息。

例如,考虑以下情况:

V1 ---E1---> V2
   ---E2---> V3 --E3--> V2

我希望得到以下 3 行;

V1, E1
V1, E2
V3, E3

我尝试了以下方法:

select label, flatten(out.label) from V
select label from (select flatten(out) from V)
select label, flatten(out) from V
select flatten(out) from V
select $current, label from (traverse out from V while $depth <= 1) where $depth = 1

但这些解决方案似乎都没有返回我想要的。如何返回顶点、边对?

4

3 回答 3

0

FLATTEN 运算符单独工作,因为获取一个字段并让它成为结果。我不明白你想做什么。你能写出预期的输出吗?

于 2013-02-26T11:44:55.280 回答
0

使用 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 图

现在稍微解释一下如何在 OrientDB 中查询。假设您加载一个顶点:SELECT * FROM Node WHERE name = 'V1'. 然后,要加载其他信息,请使用:

  • 要加载所有传入顶点(跳过边):in()
  • 加载类的所有传入顶点Link(跳过边缘):in('Link')
  • 要加载所有传入边:inE()
  • 加载类的所有传入边LinkinE('Link')
  • 加载所有传出顶点(跳过边缘):out()
  • 加载类的所有传出顶点Link(跳过边缘):out('Link')
  • 要加载所有传出边:outE()
  • 加载类的所有传出边LinkoutE('Link')

因此,在您的情况下,您想要加载所有顶点及其传出边,所以我们这样做:

SELECT name, outE('Link') FROM Node

它加载顶点的名称和指向传出边的指针:

OrientDB 查询示例

如果您想获得传出边的名称列表,我们只需执行以下操作:

SELECT name, outE('Link').name FROM Node

这使:

OrientDB 查询示例 2

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

于 2019-10-15T09:34:36.630 回答
-1

Neo4j 中使用的 CYPHER 语法终于救了我。

start n=node(*) MATCH (n)-[left]->(n2)<-[right]-(n3) WHERE n.type? ='myType' AND left.line > right.line - 1 AND left.line < right.line + 1 RETURN n, left, n2, right, n3

节点 n 是枢轴元素,可以在其上提供过滤器,就像在路径中的每个其他步骤上一样。对我来说,重要的是根据路径的其他部分选择进一步的步骤。

使用 OrientDb,我无法找到一种轻松将属性相互关联的方法。

于 2013-02-26T13:32:54.527 回答