1

ソース ノードと宛先ノードがあり、パス内のノードとリレーション タイプに制限を加えたいと考えています。Neo4j Java APIを使用しています。

次のおもちゃの例を考えてみましょう。

3 つの人物ノード A、B、C があります。

ソース ノード: A &宛先ノード: B . それらの間に存在する可能性のある他の多くの種類のパスがあります。次のような特定の形式へのパスを制限したい-

(person) -[worksAt]-> (company) -[CompetitorOf]-> (company) <-[worksAt]- (person)

これは暗号クエリから非常に簡単に実現できますが、Java API を使用してそれを行う方法があるか知りたいです。

ここに画像の説明を入力

ノート:

  1. パスの長さを制限することはお勧めしません。問題は解決しません。パス内のノードとリレーション タイプを制限したい。
  2. 上記の例はおもちゃの例です。私が作業しようとしているグラフはより複雑であり、個々のパスをトラバースして検証することが現実的ではない可能性のあるパスが多数あります。
4

2 に答える 2

3

あなたが実際に何を計算しようとしているのか、あなたの質問からはあまり明確ではありません。A社とB社があり、彼らの会社が競合しているかどうかを知りたいですか? あなたはCを持っていて、彼らの友人の中で競合する会社で働いている人を見つけたいですか?

とにかく、トラバーサル API を使用している場合 (パスについて話している場合)、トラバースする次のタイプのリレーションシップを決定するためにの最後のリレーションシップPathExpanderを使用するカスタムを作成できます。Path

リレーションシップを手動でトラバースしているだけなら、問題はわかりませんNode.getRelationships(RelationshipType, Direction)。各ステップで適切なパラメーターを使用して呼び出すだけです。

Cypher で行うこととは対照的に、パスで探しているパターンを宣言するのではなく、必要なパターンに従うようにパスを計算するだけです。

于 2016-10-18T12:37:53.570 に答える
0

Neo4j Javaのドキュメントを注意深く読み、コードを試した後、次のソリューションが機能するようになりました-

を使用PathFinderしてカスタムを作成して探索するパスをフィルタリングするには。PathExpanderPathExpanderBuilder

PathExpanderBuilder pathExpanderBuilder = PathExpanderBuilder.empty();

pathExpanderBuilder.add(RelationshipType.withName("worksat"), Direction.OUTGOING);
pathExpanderBuilder.add(RelationshipType.withName("competitorof"), Direction.BOTH);
pathExpanderBuilder.add(RelationshipType.withName("worksat"), Direction.INCOMING);

PathExpander<Object> pathExpander pathExpander = pathExpanderBuilder.build();

カスタムを作成したら、PathExpanderそれを使用してPathFinderPathFinder.

PathFinder<Path> allPathFinder = GraphAlgoFactory.allSimplePaths(this.pathExpander, 4);


Iterable<Path> allPaths = allPathFinder.findAllPaths(sourceNode, targetNode);

この例sourceNodeでは、ノード「A」targetNodeがノード「B」になります。

于 2016-10-21T06:08:29.350 に答える