OrientDB从查询中选择顶点,边对

问题描述 投票:2回答:3

在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

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

sql orientdb graph-databases
3个回答
0
投票

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


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'

这将创建以下图形:

Example OrientDB graph

现在对如何在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

加载顶点的名称和指向输出边缘的指针:

Example of OrientDB query

如果您想获得外发边缘的名称的列表,我们只需做:

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

哪个给:

Example of OrientDB query 2

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


-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,我找不到一种容易地将属性彼此关联的方法。

© www.soinside.com 2019 - 2024. All rights reserved.