OrientDB 2.1.3:使用约束遍历边

时间:2015-11-11 09:54:19

标签: orientdb

我在使用约束边时检测到in( )out( )TRAVERSE的奇怪行为。 给出以下DB:

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');

运行类似于this answer中的查询:

TRAVERSE out('ManagedBy') FROM (SELECT FROM Employee where nt_account = 'e0')

只返回一条记录:e0的条目。如果我将SELECT子查询替换为e0的RID,问题仍然存在。选择out('ManagedBy')时会发生类似的事情。 有趣的是,具有相同结构但没有ManagedBy约束的数据库中的相同查询会返回正确的结果。

有人知道我的代码有什么问题吗? (或者,我发现了一个错误?)

此外,是否有人知道如何编写检测图中循环的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

尽管看起来微不足道,我花了一些时间来写它。我使用的技巧是直接迭代边缘并检查是否有从目标节点退出并进入源节点的最短路径。

2 个答案:

答案 0 :(得分:2)

默认情况下,属性区分大小写

http://orientdb.com/docs/2.1/SQL-Alter-Property.html

您在 中创建 属性

CREATE PROPERTY ManagedBy.In LINK Employee;

traverse命令需要 in 属性。因此遍历过程仅返回起始节点。

中更改此声明
CREATE PROPERTY ManagedBy.in LINK Employee;

它会起作用

答案 1 :(得分:2)

我尝试过你的数据库而out()不起作用,但在()中是的。 我用“O”大写声明'ManagedBy.out',现在'out()'工作。

CREATE PROPERTY ManagedBy.Out LINK Employee

enter image description here