NEO4J-特定の接続されたコンポーネントを見つけるためのトラバーサル

StackOverflow https://stackoverflow.com/questions/19843027

  •  29-07-2022
  •  | 
  •  

質問

NEO4J 1.9.4を使用して、関係に特定の属性がある開始ノードから接続されたコンポーネント(すべての到達可能なノード)を見つけようとしています( '以来')そして、この属性には整数値が定義されています。 20130101.

私の最初のアプローチはCypherクエリを使用することでしたが、グラフ内にループがある場合、このクエリループが無限にループすると感じましたか?少なくともパスの長さを制限しない場合、長さを制限することは私がやりたいことではありません。

その間、私はトラバーサルを使用し始めました。 neo4jphpの使用トラバーサルは次のように見えます。

$traversal->setOrder(Everyman\Neo4j\Traversal::OrderBreadthFirst)
    ->setPruneEvaluator(Everyman\Neo4j\Traversal::PruneNone)
    ->setReturnFilter(Everyman\Neo4j\Traversal::ReturnAll)
    ->setUniqueness(Everyman\Neo4j\Traversal::UniquenessNodeGlobal);

私が必要だと思うのは、このようなものです:

->setPruneEvaluator('javascript', "position.RELATIONSHIP().getProperty('since').EQUALS(20130101)")

明らかに、 関係平等です 間違っているようです。この例からこれを採用しました https://github.com/jadell/neo4jphp/wiki/traversals, 、次の有効で作業しているPruneElevaterが設定されています。

->setPruneEvaluator('javascript', "position.endNode().getProperty('name').toLowerCase().contains('t')")

私はJavasscriptに絶対に精通していないので、それを行う方法を理解できません。さらに、プロパティを持っていない関係がある場合、トラバーサルがエラーをもたらさないことを確認するにはどうすればよいですか」以来「?cypher queryを使用して同じことを達成できれば、それも受け入れます。

編集: :ところで、Cypherを使用した私のアプローチはこれでした:

START n=node({start_node}) MATCH p = n-[*]-m WHERE ALL(x IN RELATIONSHIPS(p) WHERE HAS(x.since) AND x.since = 20130101) RETURN DISTINCT m

編集2: :Ulkasから提案されたCypherクエリを試すと、次のエラーが得られます。

Invalid query
string matching regex ``(``|[^`])*`' expected but `*' found
Think we should have better error message here? Help us by sending this query to cypher@neo4j.org.
Thank you, the Neo4j Team.
"START n=node(40317) MATCH p = n-[r:*..]-m WHERE has(r.since) AND r.since = 20130101 RETURN DISTINCT m"
                                    ^

編集3: :LaMeCodeの提案は非常に有望に見えましたが、それでもエラーを返します。

Fatal error: Uncaught exception 'Everyman\Neo4j\Exception' with message 'Unable to execute traversal [400]: Headers: Array ( [Content-Length] => 5183 [Content-Type] => application/json; charset=UTF-8 [Access-Control-Allow-Origin] => * [Server] => Jetty(6.1.25) ) Body: Array ( [message] => Failed to execute script, see nested exception. [exception] => EvaluationException [fullname] => org.neo4j.server.rest.domain.EvaluationException [stacktrace] => Array ( [0] => org.neo4j.server.scripting.javascript.JavascriptExecutor.execute(JavascriptExecutor.java:118) [1] => org.neo4j.server.rest.domain.EvaluatorFactory$ScriptedEvaluator.evalPosition(EvaluatorFactory.java:140) [2] => org.neo4j.server.rest.domain.EvaluatorFactory$ScriptedPruneEvaluator.evaluate(EvaluatorFactory.java:161) [3] => org.neo4j.graphdb.traversal.Evaluator$AsPathEvaluator.evaluate(Evaluator.java:69) [4] => org.neo4j.kernel.impl.traversal.TraverserIterator.eva in /var/www/vendor/everyman/neo4jphp/lib/Everyman/Neo4j/Command.php on line 116

そして、私は次のpruneevaluatorを使用しました:

->setPruneEvaluator('javascript', "position.lastRelationship().hasProperty('since') && position.lastRelationship().getProperty('since') == 20130101")

から変更するとき laStrelationship()endnode() 少なくとも、それが戻ってくる多くの結果について疑問に思っているにもかかわらず、少なくとも私にエラーを返しません。そのため、プルーン評価者は機能しないようです。プロパティ以降、またはそれが与えられていない場合、各エンドノードで停止することを期待していましたか?何が間違っているのですか、何かアイデアはありますか?

役に立ちましたか?

解決

使用しているトラバーサーに関して。 JavaScript Prune Evaluatorの「位置」変数は、パスオブジェクトです。見る: http://components.neo4j.org/neo4j/1.9.4/apidocs/org/neo4j/graphdb/path.html

これらの方法はあなたが利用できるようにする必要があります。

使用する lastRelationship() (前者の関係はすべて、プルーン評価者を介してすでに来ているからです)。

関係オブジェクトは継承します プロパティコンテナ そしてそれは hasProperty() 方法。

setPruneEvaluator('javascript', "position.lastRelationship().hasProperty('since') && position.lastRelationship().getProperty('since') == 20130101")

JavaScriptなので、Equalsメソッドを使用する必要があるかどうかはわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top