2

私は Neo4j を使用して OOP アーキテクチャの関係を追跡しています。(u) -[:EXTENDS]-> (v)ノードがクラスを表し、クラスがクラスをu拡張すると仮定しvます (つまり、各ノードにはタイプ の出力エッジが最大で 1 つ存在しますEXTENDS)。特定のクラス ( ) の先行クラスのチェーンを見つけようとしていますn。次の Cypher クエリを使用しました。

start n=node(...)
match (n) -[:EXTENDS*]-> (m)
return m.className

クラスの直接の前任者nが最初に来て、その前任者が2番目になるなどの順序でノードを処理する必要があります.Neo4jエンジンは正確にこの順序でノードを返すようです(上記のクエリを考えると)-これは私がすべきことですこの動作は、将来のリリースの一部で突然変更される可能性がありますか?

この動作に依存しない場合、Cypher クエリを使用すると、指定された順序ですべての先行ノードを取得できますか? 私は次のクエリについて考えていました:

start n=node(...)
match p = (n) -[:EXTENDS*]-> (m {className: 'Object'})
return p

Objectこれは問題なく機能しますが、ルート クラス (この場合)を指定することは避けたいと思います。

4

1 に答える 1

4

これは実際に機能しているグラフ データベースの性質であるため、すぐに変更される可能性はほとんどありません。

作成したクエリは、そのパターンに一致するノードのすべての可能な「パス」を返します。しかし、そのような各ノードから最大 1 つの :EXTENDS エッジがあることを指定した場合、クエリに含めた方向で順序が暗示されます。

つまり、返されたものは、チェーン内のノードの「スキップ」を開始しません。

ただし、それが行うことは、パスのすべての「サブパス」を提供することです。つまり、次のパスのノード「a」の先行ノードが必要であると指定したと仮定します...

(a)-[:EXTENDS]->(b)-[:EXTENDS]->(c)

...クエリ (プロパティ名を省略) は、"a, b, c" と "a, b" を返します。その前身のすべてのみが必要で、Cypher 2.x を使用できる場合は、次のような「パス」方法の使用を検討してください。

MATCH p = (a)-[:EXTENDS*]->(b)
WITH p
ORDER BY length(p) DESC
LIMIT 1
RETURN extract(x in nodes(p) | p.className)

また、ベスト プラクティスとして、無限の長さのパスを見ていることを考えると、クエリが行うホップの数を妥当なものに制限する必要があります。

MATCH (n) -[:EXTENDS*0..10]-> (m)

またはそのようなもの。

HTH

于 2014-07-08T20:16:57.563 に答える