2016-05-03 7 views
0

Ich habe Grafik: (:Sector)<-[:BELONGS_TO]-(:Company)-[:PRODUCE]->(:Product).Neo4j/Cypher, die ersten n Knoten in der Traversal Zweig

Ich bin auf der Suche nach der Abfrage unten.

Beginnen Sie mit (:Sector). Dann passen Sie die ersten 50 Unternehmen in diesem Bereich an und für jedes Unternehmen die ersten 10 Produkte.

Die erste Grenze ist einfach. Aber was ist mit der Begrenzung von Produkten?

Ist es möglich mit Chiffre?

UPDATE

Wie @cybersam unten Abfrage vorgeschlagen wird gültige Ergebnisse

MATCH (s:Sector)<-[:BELONGS_TO]-(c:Company) 
WITH c 
LIMIT 50 
MATCH (c)-[:PRODUCE]->(p:Product) 
WITH c, (COLLECT(p))[0..10] AS products 
RETURN c, products 

jedoch diese Lösung nicht zurück skaliert, da es alle Produkte pro Unternehmen durchläuft nach wie vor. Slice angewendet nach jedem Unternehmen Produkte gesammelt. Wenn die Anzahl der Produkte steigt, wird sich die Abfrageleistung verschlechtern.

Antwort

1

Jede zurückgegebene Zeile dieser Abfrage enthält: einen Sektor, eines seiner Unternehmen (höchstens 50 pro Sektor) sowie eine Sammlung von bis zu 10 Produkten für das Unternehmen:

MATCH (s:Sector)<-[:BELONGS_TO]-(c:Company) 
WITH s, (COLLECT(c))[0..50] AS companies 
UNWIND companies AS company 
MATCH (company)-[:PRODUCE]->(p:Product) 
WITH s, company, (COLLECT(p))[0..10] AS products; 
+1

prost @cybersam. Diese Abfrage funktioniert. Aber wie wird es skalieren, wenn die Anzahl der Produkte pro Unternehmen wächst? Sie werden immer noch alle Produkte zusammenpassen, sie gruppieren und danach begrenzen. Ich war interessiert, ob es möglich ist, den Abgleich zu beenden, wenn Sie eine bestimmte Anzahl von Knoten gefunden haben. – drgraduss

+0

Das ist eine gute Frage. Leider sehe ich keine Möglichkeit, 'LIMIT' zu verwenden, so dass es nur die Produkte pro Firma limitiert. – cybersam

+0

okay. scheint wie Traversal Framework API ist die Antwort für mich. Ich werde die Antwort mit Hinweis auf Skalierbarkeit akzeptieren. Danke für deine Hilfe @cybersam. – drgraduss

1

Aktualisierung mit einigen Lösungen unter Verwendung APOC Procedures.

Dieser Artikel der Neo4j-Wissensdatenbank unter limiting results per row beschreibt einige verschiedene Möglichkeiten, dies zu tun.

Eine Möglichkeit besteht darin, mit apoc.cypher.run() eine begrenzte Unterabfrage pro Zeile auszuführen. Angewandt auf die Abfrage in Frage, würde diese Arbeit:

MATCH (s:Sector)<-[:BELONGS_TO]-(c:Company) 
WITH c 
LIMIT 50 
CALL apoc.cypher.run('MATCH (c)-[:PRODUCE]->(p:Product) WITH p LIMIT 10 RETURN collect(p) as products', {c:c}) YIELD value 
RETURN c, value.products AS products 

Die andere Alternative erwähnt wird APOC Weg Expander Verfahren verwendet wird, das Etikett auf einem Abschlussfilter bereitstellt und eine Grenze:

MATCH (s:Sector)<-[:BELONGS_TO]-(c:Company) 
WITH c 
LIMIT 50 
CALL apoc.path.subgraphNodes(c, {maxLevel:1, relationshipFilter:'PRODUCE>', labelFilter:'/Product', limit:10}) YIELD node 
RETURN c, collect(node) AS products