2016-07-16 8 views
0

Ich habe eine neo4j-Instanz, in der ich mehrere Arten von Knoten (Labels) habe, jede mit ihren eigenen Eigenschaften. So ich sagen haben:Neo4J: Cypher, um über alle Knoten und alle Eigenschaften zu suchen

Bezeichnung "Person" mit Eigenschaften ("Name", "Adresse", "Name des Vaters")
Bezeichnung "Location" mit Eigenschaften ("Namen", "Land", "City")
Etikett „Ereignis“ mit Eigenschaften („Name“, „Stadt“, „Country“)
und so weiter ...

nun eine Möglichkeit für eine Abfrage wie „xyz“, wenn ich das wissen zu suchen ist Besonderheiten:

Say: match (n: Person) in dem n.Name = "xyz" RETUEN n

Meine Frage ist, gibt es eine einzige 'effiziente' Abfrage, die eine Blindsuche durchführen kann. Grundsätzlich sollte es in der Lage sein, alle Labels und alle Eigenschaften zu durchsuchen und mir die passenden Knoten zu geben. Also eine einzige Abfrage, um 'xyz' mit allen Eigenschaften von Personen, Orten, Ereignissen und anderen Labels in meiner Datenbank abzugleichen.

Ich verstehe, eine Möglichkeit könnte eine extrem lange where-Klausel verwenden, wobei ich alle meine Etiketten und ihre jeweiligen Eigenschaften fest codiere, aber ich suche nicht danach. Gibt es eine starightforward neo4j Cypher, um dies zu tun?

Dank Abhi

Antwort

1

Sie können eine vollständige grafische Darstellung Scan tun, die natürlich O (n) geben Sache ist:

match (n) 
with n, [x in keys(n) WHERE n[x]='xyz'] as doesMatch 
where size(doesMatch) > 0 
return n 

Eine andere - mehr performant, sondern auch Art und Weise komplexer - Ansatz der Umsetzung wäre a TransactionEventHandler setzen Sie alle Eigenschaften in einen Legacy-Index und dann auf diese Anfrage.

+0

Hallo Stefan, Danke. Die Abfrage funktioniert, aber wie von Ihnen erwähnt, ist extrem langsam. Momentan ist mein Graph nur ein paar Millionen Knoten und die Abfrage braucht Zeit. Ich verstehe, dass dies nicht skalierbar ist. Vermutlich ist die Integration von Neo4j mit Solr/Lucene eine Option. Also können alle universellen Suchanfragen auf Lucene gerichtet sein, weil ich glaube, dass es für solche Szenarien besser optimiert ist? – user1826116

+0

Wir hatten dasselbe Problem und konnten Apache Solr umgehen. Die Leistung ist ziemlich gut, muss aber mit neo4j synchronisiert werden, wenn Sie Änderungen an db vornehmen, was der einzige Nachteil ist, dem wir gegenüberstehen. –

1

Denken Sie daran, dass neo4j zwar gut für die Suche nach Dingen ist, wenn Beziehungen involviert sind, oder wenn Sie die von bestimmten Labels und Eigenschaften durchsuchten Knoten einschränken können, ist Ihre Suche nicht neo4js Stärke. Nur wenige Datenbanken sind gut für diese umfassende Suche.

Sie sollten in Erwägung ziehen, eine ElasticSearch-Schicht auf neo4j hinzuzufügen, da dies DAS Werkzeug für jede Art von Rich-Search in einer Datenbank ist.

+0

Danke. Mein Wissen über ElasticSearch ist ziemlich begrenzt, aber ich glaube konzeptionell ist es ähnlich zu Lucene. Auch denke ich, dass neo4j standardmäßig Lucene-Indizes verwendet. Ich wollte nur verstehen, wie die Integration von ElasticSearch (https://neo4j.com/developer/elastic-search/) besser wird als die Legacy-Indexierung von Legenden. Oder liege ich völlig falsch in meinen Annahmen? – user1826116

+0

Mein Verständnis ist ES verwendet einen invertierten Index über alle Felder aller Dokumente. Dies ist perfekt für blinde Suchen wie Ihr Fall, es sollte blitzschnell sein. Neo4j verwendet Lucene, aber die Indizierung ist kein Volltext für alle Knoten. Sie sehen nur Vorteile, wenn Schemaindizes (oder eindeutige Integritätsbedingungen) in einer: label (property) -Kombination erstellt werden. Damit neo4j die Blindsuche über alles hinweg unterstützt, müssten Sie Indizes für jede Kombination aus Label und Eigenschaften erstellen, eine sehr schlimme Idee, mit einem harten manuellen Pflegeaufwand für neue Eigenschaften oder Labels. Verwenden Sie für diese umfangreichen Suchanforderungen eine ES-Ebene oben. – InverseFalcon

+0

Offenbar können Legacy-Indizes in neo4j für die Volltextsuche über alles konfiguriert werden. Vielleicht sollten Sie das Handbuch hierzu prüfen und prüfen, ob Sie explizit den Index verwenden müssen. Schema-Indizes werden wann immer möglich unter der Haube verwendet, aber ich denke, dass Sie die Verwendung veralteter Indizes manuell aufrufen müssen. – InverseFalcon

Verwandte Themen