Question

En utilisant Neo4j 1.9.4, j'essaie de trouver les composants connectés (tous les nœuds accessibles) à partir d'un nœud de départ où la relation a un certain attribut ('puisque') Et cet attribut a une valeur entière définie, par exemple 20130101.

Mon approche initiale consistait à utiliser une requête Cypher, mais j'ai eu l'impression que cette requête boucle à l'infini s'il y a une boucle dans le graphique? Au moins si je ne restreigne pas la longueur du chemin et que je limiter la longueur n'est pas ce que je veux faire.

Donc, en attendant, j'ai commencé à utiliser une traversée. Utilisation de Neo4JPhp, une traversée ressemble à celle-ci:

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

Ce que je pense que j'ai besoin, c'est quelque chose comme ceci:

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

Évidemment, RELATION et ÉQUIVAUT À semblent mal. J'ai adopté cela à partir de l'exemple https://github.com/jadell/neo4jphp/wiki/Traversals, où le pruneelelevater valide et fonctionnel suivant est défini:

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

Je ne connais absolument pas Javasscript, donc je ne peux pas comprendre comment faire cela. De plus, comment puis-je m'assurer que la traversée n'entraîne pas une erreur s'il existe une relation qui n'a pas la propriété "puisque"? Si je peux réaliser la même chose en utilisant une requête Cypher, j'accepterais cela aussi.

ÉDITER: Soit dit en passant, mon approche utilisant Cypher était la suivante:

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: Essayer la requête Cypher suggérée d'Ulkas me donne l'erreur suivante:

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: La suggestion de lamecode semblait vraiment prometteuse, mais elle renvoie toujours une erreur:

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

Et j'ai utilisé le pruneevaluator suivant:

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

Lorsque vous changez de lastelationship () à endnode () Au moins, cela ne me renvoie pas d'erreur, malgré que je me pose des questions sur les nombreux résultats qu'il renvoie, car aucun des nœuds n'a exactement cela depuis l'attribut ?! Il semble donc que même, l'évaluateur de pruneaux ne se met pas au travail. Je m'attendais à ce qu'il s'arrête à chaque nœud EndNode si cela n'a pas de propriété ou si ce n'est pas le qualification de la date donnée? Qu'est-ce que je fais de mal, des idées?

Était-ce utile?

La solution

En ce qui concerne le Traverser que vous utilisez. La variable JavaScript Prune Evaluator 'Position' est un objet de chemin. Voir: http://components.neo4j.org/neo4j/1.9.4/apidocs/org/neo4j/graphdb/path.html

Ces méthodes devraient vous être disponibles.

Utilisation lastRelationship() (Parce que toutes les anciennes relations auront déjà traversé l'évaluateur de pruneaux).

L'objet relationnel hérite de Conteneur de propriétés Et cela a un hasProperty() méthode.

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

Je ne sais pas si vous avez besoin d'utiliser la méthode Equals ou non depuis qu'il est javascript.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top