Pregunta

Usando Neo4J 1.9.4, estoy tratando de encontrar los componentes conectados (todos los nodos accesibles) desde un nodo inicial donde la relación tiene un cierto atributo ('ya que') y este atributo tiene un valor entero definido, por ejemplo 20130101.

Mi enfoque inicial fue usar una consulta de Cypher, pero tuve la sensación de que esta consulta buceo al infinito si hay un bucle dentro del gráfico. Al menos si no restringo la longitud del camino y restringir la longitud no es lo que quiero hacer.

Entonces, mientras tanto, comencé a usar un recorrido. Usar neo4jphp un recorrido se ve así:

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

Lo que creo que necesito es algo como esto:

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

Obviamente, RELACIÓN y Iguales parece estar mal. Adopté esto del ejemplo https://github.com/jadell/neo4jphp/wiki/traversals, donde se establece el siguiente premio válido y de trabajo:

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

No estoy absolutamente familiarizado con Javasscript, así que no puedo entender cómo hacerlo. Además, ¿cómo puedo asegurarme de que el recorrido no resulte en un error si hay una relación que no tiene la propiedad "ya que"? Si puedo lograr lo mismo usando una consulta de Cypher, también aceptaría eso.

EDITAR: Por cierto, mi enfoque usando Cypher fue este:

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

Edición2: Probar la consulta sugerida de Cypher de Ulkas me dan el siguiente error:

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

Edición3: La sugerencia de Lamecode parecía realmente prometedora, pero aún devuelve un error:

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

Y usé el siguiente Pruneevaluator:

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

Al cambiar de Latrelationship () a EndNode () Al menos no me devuelve un error, a pesar de que me pregunto sobre los muchos resultados que devuelve, ya que ninguno de los nodos tiene exactamente esto desde el atributo. Parece que incluso entonces, el evaluador de podas no funciona. ¿Esperaba que se detuviera en cada EndNode si no tiene la propiedad o si no tiene la fecha dada? ¿Qué estoy haciendo mal, alguna idea?

¿Fue útil?

Solución

En lo que respecta al Traverser que está utilizando. La variable JavaScript Prune Evaluator 'Position' es un objeto de ruta. Ver: http://components.neo4j.org/neo4j/1.9.4/apidocs/org/neo4j/graphdb/path.html

Esos métodos deberían estar disponibles para usted.

Usar lastRelationship() (Porque todas las relaciones anteriores ya habrán pasado por el evaluador de ciruela ya).

El objeto de relación hereda de Contenedor de propiedades Y eso tiene un hasProperty() método.

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

No estoy seguro de si necesita usar el método igual o no, ya que es JavaScript.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top