2017-06-20 4 views
0

Ich habe eine Frage zum effizienten Filtern von Suchergebnissen basierend auf einer Eigenschaft einer Beziehung.Neo4j Cypher Filtern von Beziehungen nach Gewicht auf großen Maßstab


Ich habe ein Diagramm wie folgt aus:

(: PERSON) - [: WORKED_WITH {Gewicht: 30}] -> (: PERSON)

mit über 300.000 Knoten markierten Person und über 15.000.000 Kanten beschriftet: WORKED_WITH (jede hat ein ganzzahliges Gewicht).


Jetzt zum Beispiel möchte ich die 10 Knoten-Kombinationen mit dem höchsten Gewicht zwischen ihnen haben. Also meine Frage wie folgt aussieht:

MATCH (n:PERSON)-[r:WORKED_WITH]->(m:PERSON) 
RETURN n.name, m.name, r.weight 
ORDER BY r.weight DESC 
LIMIT 10; 

Wie ich kürzlich las es nicht möglich ist, einen Index für eine Eigenschaft einer Beziehung zu erstellen. Ich lese, dass Sie Knoten für Partitionen wie < 50, 50-100,> 100 als Beispiel erstellen können, aber das fühlt sich nicht wie Best Practice an ... Gibt es eine Möglichkeit, etwas zu verwenden, das sich wie ein Index (Ungleichheit) verhält? Oder wie würden Sie diese Art von Problemen effizient lösen?

Grüße Wolfgang

Antwort

0

Stefan Armbruster erklärt den Punkt (und Optionen) auch in How to create an index on a property of a relation.

Wenn die Beziehung der einzige Einstiegspunkt in Ihr Diagramm ist (lesen Sie: Wenn es keine andere Möglichkeit gibt, die anfängliche Suche zu reduzieren) ... dann möchten Sie es vielleicht (als Knoten) umgestalten. Das mag sich zwar nicht "richtig" anfühlen, aber es ist Best Practice.

hoffte, das hilft, Tom

+0

Vielen Dank für Ihre Antwort, ich schon, dass die Post lesen, aber nicht glaubte, es trifft genau mein Problem ... –

+0

Das Problem Ihr Einstiegspunkt in das Diagramm ist. Wenn ich deine Erklärung gut verstehe (korrigiere mich wenn nicht), ist der einzige bestimmende Faktor die Eigenschaft auf der Beziehung. Wenn ja, sind Ihre Möglichkeiten begrenzt (wenn Sie wollen, dass die Dinge schnell sind). –

+0

Ich möchte nicht das Datenmodell für jede neue Aufgabe ändern ... Ich dachte an etwas wie zwingen Neo4j intern basierend auf dieser Eigenschaft zu sortieren ... Also ich könnte leicht sagen rel.weight> 50 oder zwischen 30 und 50 .... Ich werde später einen Jaccard-Koeffizienten verwenden, der noch schwieriger zu splitten wäre ... –