我已经发现的怪异的行为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')
仅返回一条记录:的条目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
看起来很琐碎,我花了一些时间来编写它。我使用的技巧是直接在边缘上进行迭代,并检查是否存在从目标节点到源节点的最短路径。
默认情况下,属性区分大小写
http://orientdb.com/docs/2.1/SQL-Alter-Property.html
创建于财产在
CREATE PROPERTY ManagedBy.In LINK Employee;
traverse命令期望使用in属性。因此,遍历过程仅返回起始节点。
更改此语句
CREATE PROPERTY ManagedBy.in LINK Employee;
它会工作
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句