문제

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 쿼리를 사용하여 동일하게 달성 할 수 있다면 나는 그것을 받아 들일 것입니다.

편집하다: 그건 그렇고, 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: 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"
                                    ^

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 () 에게 엔드 노드 () 적어도 나에게 오류를 반환하지는 않습니다. 많은 결과에 대해 궁금해하지만 노드 중 어느 것도 속성 이후로 이것을 가지고 있지 않기 때문입니까?! 따라서 심지어 자두 평가자가 작동하지 않는 것 같습니다. 속성 이후가 없거나 주어진 날짜가 자격이없는 경우 각 엔드 노드에서 멈출 것으로 예상 했습니까? 내가 뭘 잘못하고 있는가, 어떤 아이디어?

도움이 되었습니까?

해결책

사용중인 트래버서와 관련하여. JavaScript Prune Evaluator '위치'변수는 경로 객체입니다. 보다: http://components.neo4j.org/neo4j/1.9.4/apidocs/org/neo4j/graphdb/path.html

이러한 방법은 귀하에게 제공되어야합니다.

사용 lastRelationship() (이전의 모든 관계는 이미 자두 평가자를 통해 왔을 것입니다).

관계 개체는에서 상속됩니다 속성 컨테이너 그리고 그것은 a hasProperty() 방법.

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

JavaScript이므로 Equals 메소드를 사용해야하는지 확실하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top