سؤال

باستخدام 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, ، حيث يتم تعيين تقليم ساري المفعول والعلاج التالي:

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

أنا لست على دراية على الإطلاق بـ Javasscript ، لذلك لا يمكنني معرفة كيفية القيام بذلك. بالإضافة إلى ذلك ، كيف يمكنني التأكد من أن اجتياز لا يؤدي إلى خطأ إذا كانت هناك علاقة لا تحتوي على الخاصية "حيث"؟ إذا كان بإمكاني تحقيق ذلك باستخدام استعلام Cypher ، فسأقبل ذلك أيضًا.

تعديل: بالمناسبة ، كان نهجتي باستخدام 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

EDIT2: محاولة استعلام Cypher المقترح من Ulkas تعطيني الخطأ التالي:

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"
                                    ^

EDIT3: بدا اقتراح 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 () على الأقل لا يعيد لي خطأً ، على الرغم من أنني أتساءل عن العديد من النتائج التي تعود إليها ، لأن أيا من العقد لا يوجد هذا بالضبط منذ السمة؟! لذلك يبدو ذلك حتى ذلك الحين ، لا يحصل المقيِّم على التقليم إلى العمل. كنت أتوقع أن يتوقف عند كل نهاية إذا لم يكن هناك منذ خاصية أو إذا كان غير رسمي التاريخ المحدد؟ ماذا أفعل خطأ ، أي أفكار؟

هل كانت مفيدة؟

المحلول

فيما يتعلق بالمساحات التي تستخدمها. متغير "موضع" وضع "جافا سكريبت" هو كائن مسار. نرى: 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top