在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
答案 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'
这将创建以下图形:
现在对如何在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比您想象的要聪明:)