我正在使用Neo4j和OrientDB,我将比较它们在遍历方面的性能和功能(Neo4j中的Java Traversal API和OrientDB中的Native Fluent API)。
对于OrientDB,应该可以从特定顶点开始并获取所有可到达的顶点,并且还存在每个单独步骤上属性 access 的交集。如果您有图表 A - > B - > C - > D ,其中 A,B和C 具有 access = www 且 D 具有值 access = https ,应返回顶点 A,B和C 。
我最近问了一个问题,然后我发布了我的解决方案,如何在Neo4j上对属性进行比较。
Neo4j node property comparison during traversal
在Neo4j中,可以创建TraversalDescription,它描述了规则和遍历的行为。例如,以下内容: AccesListEvaluator 将比较两个连接节点的属性,如上面提到的Neo4j比较的已发布解决方案所示。
TraversalDescription td = db.traversalDescription().depthFirst()
.relationships(RelationshipLabel.REFERENCED_BY, Direction.OUTGOING)
.evaluator(new AccessListEvaluator());
如果执行以下代码示例,您将从startNode返回所有可到达的节点,您可以迭代它们并提取其所有属性。
td.traverse(startNode).nodes();
我需要节点,因为我必须提取它们的属性并将其存储在自己的数据结构中。
是否可以使用OrientDB Native Fluent API的类似解决方案?我查看了手册Java Traverse,但我无法从给定的示例中偏离工作解决方案。如果我执行以下代码示例,我只需获取目标的属性以及IN和OUT连接。
for (OIdentifiable oi : new OTraverse().field("in").field("out").target(new ORecordId("#24:0"))) {
System.out.println(oi);
}
对我来说,看起来,您只能获得与其他节点的可能连接。 是否有机会使用Native API来获取每个顶点和每个顶点的属性?
希望我的问题是可以理解的。 提前致谢
答案 0 :(得分:0)
我想我正在研究类似的问题。我正在使用python(PyOrient)连接到OrientDB,我通常使用SQL语法。我一直在尝试利用TRAVERSE或fetchPlan。
当我使用TRAVERSE时,我能够在控制台中获得所有具有类似查询的属性的顶点和eges(在工作室中的结果相同):
orientdb {db=FetchPlanTesting}> traverse * from level01
----+------+---------+------------------+------------+------+------+-------------
# |@RID |@CLASS |name |in_belongsTo|out |in |out_belongsTo
----+------+---------+------------------+------------+------+------+-------------
0 |#11:0 |Level01 |Item01_at_Level01 |[size=2] |null |null |null
1 |#20:1 |belongsTo|null |null |#12:1 |#11:0 |null
2 |#12:1 |Level02 |Item02_at_Level02 |[size=2] |null |null |[size=1]
3 |#20:4 |belongsTo|null |null |#13:0 |#12:1 |null
4 |#13:0 |Level03 |Item01_at_Level03 |[size=2] |null |null |[size=1]
5 |#20:19|belongsTo|null |null |#14:7 |#13:0 |null
6 |#14:7 |Level04 |Item08_at_Level04 |[size=2] |null |null |[size=1]
7 |#20:34|belongsTo|null |null |#15:6 |#14:7 |null
8 |#15:6 |Level05 |Item07_at_Level05 |null |null |null |[size=1]
9 |#20:50|belongsTo|null |null |#15:22|#14:7 |null
10 |#15:22|Level05 |Item023_at_Level05|null |null |null |[size=1]
11 |#20:27|belongsTo|null |null |#14:15|#13:0 |null
12 |#14:15|Level04 |Item016_at_Level04|[size=2] |null |null |[size=1]
13 |#20:42|belongsTo|null |null |#15:14|#14:15|null
14 |#15:14|Level05 |Item015_at_Level05|null |null |null |[size=1]
15 |#20:58|belongsTo|null |null |#15:30|#14:15|null
16 |#15:30|Level05 |Item031_at_Level05|null |null |null |[size=1]
17 |#20:8 |belongsTo|null |null |#13:4 |#12:1 |null
18 |#13:4 |Level03 |Item05_at_Level03 |[size=2] |null |null |[size=1]
19 |#20:15|belongsTo|null |null |#14:3 |#13:4 |null
----+------+---------+------------------+------------+------+------+-------------
LIMIT EXCEEDED: resultset contains more items not displayed (limit=20)
我在任何节点上拥有的唯一属性是name
。我似乎记得我可以过滤掉belongsTo
边(或者至少只查找特定的类),但我已经切换到尝试fetchPlan所以我可以获得一个嵌套的JSON blob而不是。那个查询很容易(`,但是我试图弄清楚如何最好地限制深度而不是实际返回边缘作为结果的一部分。
这是查询和结果在控制台(在工作室中相同): orientdb {db = FetchPlanTesting}>从11:0
中选择@ this.toJSON('fetchPlan:*: - 1')----+------+--------------------------------------------------------------------------------------------------------------------------------------------
# |@CLASS|this
----+------+--------------------------------------------------------------------------------------------------------------------------------------------
0 |null |{"name":"Item01_at_Level01","in_belongsTo":[{"out":{"name":"Item02_at_Level02","in_belongsTo":[{"out":{"name":"Item01_at_Level03","in_bel...
----+------+--------------------------------------------------------------------------------------------------------------------------------------------
1 item(s) found. Query executed in 0.024 sec(s).