2016-07-04 27 views
2

Ich habe recently asked about how to find all paths between two types os nodes in a way where all the edges in the path had the same attribute (wie die gleiche ID). Das wäre so etwas wie:Suche nach bestimmten Pfad in Neo4j schnell

MATCH (a {type: 'cin1'})-[rels:Next*1.. {value: 1}]->(b {type: 'cancer'}) 
RETURN (a), (b) 

wo statt Wert aufweist: für alle Kanten: 1 I Wert haben würde.

fand ich einen Weg, dies wie dies durch den Einsatz etwas zu lösen (wie in meiner anderen Frage beantwortet):

MATCH (a:Label {type: 'cin1'}) 
MATCH (b:Label {type: 'cancer'}) 
MATCH shortestPath((a)-[rels:Next*1..20]->(b)) 
WHERE ALL(r in tail(rels) WHERE (head(rels)).value = r.value) 
RETURN (a), (b) 

Das Problem ist, ich habe, dass dieser Ansatz alle möglichen unterschiedlichen Pfaden erstellen, um erste dann filtere sie, was in meinem Fall exponentiell viele Wege schafft. Nehmen wir zum Beispiel die folgende Grafik

graph example:

Der Ansatz gegeben werden alle Pfade ersten Spiel:

id:1 -> id:1 -> id:1 
id:1 -> id:2 -> id:1 
id:1 -> id:1 -> id:2 
id:1 -> id:2 -> id:2 
id:1 -> id:2 -> id:3 
... 

Und nur dann diese Optionen filtern, um zurückzukehren 1-> 1-> 1, 2-> 2-> 2, 3-> 3-> 3 und so weiter. Daher stellt sich heraus, dass dieser Ansatz sehr unwirksam ist, und ich frage mich, ob es einen einfacheren Weg gibt.

+0

Gibt es eine Möglichkeit, Ihre Beziehungen zu optimieren? Im Moment nehme ich an, dass alle dasselbe Label mit unterschiedlichen Attributen verwenden. Können Sie sie stattdessen in Etiketten umwandeln, oder ist das nicht möglich? – InverseFalcon

+0

ist nicht machbar:/im Grunde haben Sie zu viele von ihnen –

+0

Ich hatte Angst davor. Obwohl ich Ihre Leistungsprobleme verstehe, frage ich mich, ob Sie dies in einem Beispiel-Dataset ausgeführt haben, um zu bestätigen, dass die Leistung wirklich ein Problem darstellt. Ich nehme an, Sie haben einen riesigen Datensatz mit einem ziemlich massiven Netz von Verbindungen? – InverseFalcon

Antwort

0

Soweit Optimierungen, würde ich zuerst nach Möglichkeiten suchen, schnelle Übereinstimmungen auf Start- und Endknoten zu optimieren, da dies die gescannten Knoten erheblich reduzieren sollte.

Meine Ahnung ist, dass Sie wahrscheinlich nicht indizieren auf: Label.type, und wenn das ist Ihre primäre Methode der Zuordnung zu Knoten, ist dies wahrscheinlich etwas zu prüfen und zu testen.

Es kann auch effektiv sein zu sehen, ob Sie Labels auf Ihrem Start- oder Endknoten hinzufügen können. Zumindest scheint es so: Krebs könnte wahrscheinlich effektiv angewendet werden, obwohl, wenn dies eine allgemeinere medizinische App sein soll, diese Art von Abfrage für viele Krankheiten effektiv sein müsste, bin ich mir nicht sicher, ob dies machbar ist Sie.

In diesem Fall ich denke, Ihre beste Wette ist, um die shortestPath() und PROFIL Ihre Abfrage zu optimieren, um sicherzustellen, dass Ihre WHERE ALL-Klausel bei der Berechnung der shortestPath verwendet wird, und nicht als ein Filter nach eingehender Suche (siehe Shortest Path und Shortest Path Planning). Wenn beim Profiling festgestellt wird, dass es als Filter verwendet wird und nicht während der Erstellung des kürzesten Pfads, sollten Sie überprüfen, ob ein effizienterer Prädikat-Kürzester Pfad für nicht übereinstimmende Muster schnell ausfallen kann.