在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
但是这些解决方案似乎都没有返回我想要的。如何返回顶点,边对?
FLATTEN运算符是单独工作的,因为获取一个字段并使其成为结果。我不明白你想做什么。您能写出预期的输出吗?
您尝试使用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比您想象的要聪明:)
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,我找不到一种容易地将属性彼此关联的方法。