2017-03-08 2 views
0

J'ai un problème en essayant de "déchiffrer" un arbre logique avec Neo4js Cypher. J'ai un arbre logique d'opération à feuilles. Je veux collecter des ensembles valides de feuilles. J'essaie actuellement de collecter des jeux de feuilles valides sur un nœud de configuration valide. Donc, je peux plus tard rapidement passer par ce nœud de configuration.XOR, AND Arbre dans Neo4j Cypher

Exemple (1 AND 2) AND (3 AND 4) est facile à match (rule)-[AND*]->(leaf) return collect(leaf) Cependant (1 XOR 2) AND (3 XOR 4) Est-ce un problème parce que chaque fois que je collectionne 1,2,3,4 dans une seule variable, je ne peux pas plus tard obtenir correctement le produit cartésien de l'opération ET. (13,14,23,24) serait valide.

En général, j'ai un arbre de profondeur variable (jusqu'à max 3-4) opérations sont XOR, AND, Not AND, Not XOR

  • est-il un moyen simple Cypher me manque pour naviguer ces arbres?
  • Est-ce que tenter de fusionner des ensembles valides dans un noeud ValidConfiguration est une bonne idée pour les requêtes rapides?
  • Ensuite, il devrait soutenir une requête de la forme (:Model)->(:ValidConf)->(:Leaf:Option)->(:Feature) puis retourner tous les modèles qui ont une certaine caractéristique dans une configuration valide. Ou plusieurs fonctionnalités à un certain prix de configuration. Ai-je besoin d'UDF ou d'ObjectGraphMapper pour résoudre ce problème?

  • Y a-t-il des fonctions définies par l'utilisateur qui fonctionnent avec de tels arbres de décision que je peux utiliser?

Toute aide serait grandement appréciée.

Créer Exemple

CREATE (r:Rule{id:123})-[:COMPOSITION]-> 
startOp:AndOperation:Operation:Operand) 
CREATE (startOp)-[:AND]->(intermediateOp1:OrOperation:Operation:Operand) 
CREATE (startOp)-[:AND]->(intermediateOp2:OrOperation:Operation:Operand) 
CREATE (intermediateOp1)-[:XOR]->(o1:Option:Operand{id:321}) 
CREATE (intermediateOp1)-[:XOR]->(o2:Option:Operand{id:564}) 
CREATE (intermediateOp2)-[:XOR]->(o3:Option:Operand{id:876}) 
CREATE (intermediateOp2)-[:XOR]->(o4:Option:Operand{id:227}) 
CREATE (o1)-[:CONSISTS_OF]->(f1:Feature{text:"magicwand"}) 
.... 

Cet arbre est symétrique, mais ils ne sont généralement pas. Je dois rendre o1 + o4 valide et o1 + o2 ne pas être valide. Les OR doivent être compris comme XOR.

+0

A quoi ressemble votre modèle de données? Pouvez-vous partager un petit exemple de graphique (par exemple, en tant qu'opération 'CREATE')? –

Répondre

1

Je ne pense pas que Cypher va travailler pour évaluer un arbre d'expression binaire booléen. Pour citer cybersam's answer à une question connexe:

C'est parce que Cypher n'a pas des déclarations de mise en boucle assez puissant pour calculer itérativement sous-résultats (dans l'ordre) pour les arbres de profondeur arbitraire.

Vous allez devoir chercher un système supplémentaire pour faire l'évaluation.

Si vous pouvez coder Java, vous devriez pouvoir le faire en implémentant votre propre procédure personnalisée pour évaluer un arbre d'expression booléen dans le bon ordre.