OrientDB 2.1.3:带约束遍历边
OrientDB 2.1.3: traversing edges with constraints
我检测到 in( )
、out( )
和 TRAVERSE
在处理受限边时出现奇怪的行为。
给定以下数据库:
CREATE CLASS Employee EXTENDS V;
CREATE PROPERTY Employee.nt_account String;
CREATE CLASS ManagedBy EXTENDS E;
CREATE PROPERTY ManagedBy.out LINK Employee;
CREATE PROPERTY ManagedBy.In LINK Employee;
CREATE INDEX Employee.nt_account unique_hash_index;
CREATE VERTEX Employee SET nt_account = 'e0';
CREATE VERTEX Employee SET nt_account = 'e1';
CREATE VERTEX Employee SET nt_account = 'e2';
CREATE EDGE ManagedBy FROM (SELECT FROM Employee WHERE nt_account = 'e0') TO (SELECT FROM Employee WHERE nt_account = 'e1');
CREATE EDGE ManagedBy FROM (SELECT FROM Employee WHERE nt_account = 'e1') TO (SELECT FROM Employee WHERE nt_account = 'e2');
CREATE EDGE ManagedBy FROM (SELECT FROM Employee WHERE nt_account = 'e2') TO (SELECT FROM Employee WHERE nt_account = 'e0');
运行 类似于 :
中的查询
TRAVERSE out('ManagedBy') FROM (SELECT FROM Employee where nt_account = 'e0')
return只有一条记录:e0
的条目。如果我用 e0 的 RID 替换 SELECT
子查询,问题仍然存在。选择 out('ManagedBy')
时会发生类似的事情。
有趣的是,同样的查询在具有相同结构但没有ManagedBy
return约束的数据库中得到正确的结果。
有人知道我的代码有什么问题吗? (或者,我发现了错误吗?)
此外,有人知道如何编写 OSQL 查询来检测图中的循环吗?在 Cypher 中我会写
MATCH p=(e: Employee)-[:MANAGED_BY*]->(e)
RETURN p
@wolf4ood 和@LucaS 对问题的第一部分提出了很好的建议。我将第一个答案标记为正确 (FCFS),但我认为第二个答案也有效。
至于查询,我自己解决了:
SELECT out.nt_account, shortestPath(in, out, 'OUT').nt_account
FROM ManagedBy
虽然看起来微不足道,但我花了一些时间才写出来。我使用的技巧是直接在边上迭代并检查是否存在从目标节点退出到源节点的最短路径。
默认属性区分大小写
http://orientdb.com/docs/2.1/SQL-Alter-Property.html
您将 in 属性 创建为 In
CREATE PROPERTY ManagedBy.In LINK Employee;
遍历命令需要 in 属性。所以遍历过程return只有起始节点
在
中更改此声明
CREATE PROPERTY ManagedBy.in LINK Employee;
它会起作用
我试过你的数据库,但 out() 不起作用,但 in() 可以。
我用 "O" 大写声明 'ManagedBy.out',现在 'out()' 有效。
CREATE PROPERTY ManagedBy.Out LINK Employee
我检测到 in( )
、out( )
和 TRAVERSE
在处理受限边时出现奇怪的行为。
给定以下数据库:
CREATE CLASS Employee EXTENDS V;
CREATE PROPERTY Employee.nt_account String;
CREATE CLASS ManagedBy EXTENDS E;
CREATE PROPERTY ManagedBy.out LINK Employee;
CREATE PROPERTY ManagedBy.In LINK Employee;
CREATE INDEX Employee.nt_account unique_hash_index;
CREATE VERTEX Employee SET nt_account = 'e0';
CREATE VERTEX Employee SET nt_account = 'e1';
CREATE VERTEX Employee SET nt_account = 'e2';
CREATE EDGE ManagedBy FROM (SELECT FROM Employee WHERE nt_account = 'e0') TO (SELECT FROM Employee WHERE nt_account = 'e1');
CREATE EDGE ManagedBy FROM (SELECT FROM Employee WHERE nt_account = 'e1') TO (SELECT FROM Employee WHERE nt_account = 'e2');
CREATE EDGE ManagedBy FROM (SELECT FROM Employee WHERE nt_account = 'e2') TO (SELECT FROM Employee WHERE nt_account = 'e0');
运行 类似于
TRAVERSE out('ManagedBy') FROM (SELECT FROM Employee where nt_account = 'e0')
return只有一条记录:e0
的条目。如果我用 e0 的 RID 替换 SELECT
子查询,问题仍然存在。选择 out('ManagedBy')
时会发生类似的事情。
有趣的是,同样的查询在具有相同结构但没有ManagedBy
return约束的数据库中得到正确的结果。
有人知道我的代码有什么问题吗? (或者,我发现了错误吗?)
此外,有人知道如何编写 OSQL 查询来检测图中的循环吗?在 Cypher 中我会写
MATCH p=(e: Employee)-[:MANAGED_BY*]->(e)
RETURN p
@wolf4ood 和@LucaS 对问题的第一部分提出了很好的建议。我将第一个答案标记为正确 (FCFS),但我认为第二个答案也有效。 至于查询,我自己解决了:
SELECT out.nt_account, shortestPath(in, out, 'OUT').nt_account
FROM ManagedBy
虽然看起来微不足道,但我花了一些时间才写出来。我使用的技巧是直接在边上迭代并检查是否存在从目标节点退出到源节点的最短路径。
默认属性区分大小写
http://orientdb.com/docs/2.1/SQL-Alter-Property.html
您将 in 属性 创建为 In
CREATE PROPERTY ManagedBy.In LINK Employee;
遍历命令需要 in 属性。所以遍历过程return只有起始节点
在
中更改此声明CREATE PROPERTY ManagedBy.in LINK Employee;
它会起作用
我试过你的数据库,但 out() 不起作用,但 in() 可以。 我用 "O" 大写声明 'ManagedBy.out',现在 'out()' 有效。
CREATE PROPERTY ManagedBy.Out LINK Employee