OrientDb选择属性和flatten函数

时间:2013-02-26 09:57:44

标签: neo4j graph-databases orientdb

在OrientDb图数据库中,我正在尝试确定顶点对的一些属性。

为了简化它,我首先尝试获取有关Vertex,Edge对的一些信息:

select label, flatten(out.label) from V
0 item(s) found.

这会返回0个项目,因为flatten不会对label属性起作用,只会对set属性(如V.out)起作用。

因此,获取传出边缘标签的唯一方法如下:

select label from (select flatten(out) from V)

不幸的是,这会丢失顶点标签信息,只剩下一半。

解决方案(用于内部查询)因此将flatten(out)与顶点'标签组合在一起(以便能够从外部查询中引用它):

select label, flatten(out) from V

但是不返回第一列(标签)。它返回与以下完全相同的结果:

select flatten(out) from V

我试过的替代方法是使用TRAVERSE命令:

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

但是如何引用V中的枢轴点呢? $ current是Edge,而不是Vertex。

是否可以选择与扁平通话相结合的属性,如果没有,如何解决它?

一个案例;对于以下情况:

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

我希望得到以下3行;

V1, E1
V1, E2
V3, E3

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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,我无法轻易找到将属性相互关联的方法。

答案 2 :(得分: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比您想象的要聪明:)