2017-01-26 3 views
2

ich eine große Grafik, wo einige der Beziehungen Eigenschaften haben, die ich verwenden möchte, die Grafik effektiv zu beschneiden, wie ich einen Subgraphen erstellen. Zum Beispiel, wenn ich eine Eigenschaft mit dem Namen 'relevance score' habe und ich möchte an einem Knoten beginnen und sich ausbreiten, alle Knoten und Beziehungen sammeln, aber beschneiden, wo auch immer eine Beziehung die obige Eigenschaft hat.Wie spezifische Subgraphen in Neo4j Verwendung finden, wo Klausel

Mein Versuch zu tun, saldiert um diese Abfrage:

start n=node(15) match (n)-[r*]->(x) WHERE NOT HAS(r.relevance_score) return x, r 

Mein Versuch hat zwei Probleme kann ich nicht lösen:

1) Reflektierende ich das glauben wird in einem gestutzten Graphen nicht dazu führen, sondern eine Sammlung von disjunkten Graphen. Zusätzlich:

2) Ich erhalte die folgende Fehlermeldung von dem, was sieht eine richtig gebildete Chiffre Abfrage sein:

Type mismatch: expected Any, Map, Node or Relationship but was Collection<Relationship> (line 1, column 52 (offset: 51)) 
"start n=node(15) match (n)-[r*]->(x) WHERE NOT HAS(r.relevance_score) return x, r" 
+2

Welche Version von Neo4j verwenden Sie? [START] (https://neo4j.com/docs/developer-manual/3.0/cypher/#query-start) gilt als veraltet und ['hat'] (https://neo4j.com/docs/developer -manual/3.0/cypher/# where-property-exists) wird in 3.x nicht mehr unterstützt. –

+0

3.0.6. Es funktioniert immer noch für andere Abfragen, aber gut zu wissen. Ich habe diesen Punkt in der Dokumentation – WildBill

Antwort

3

Sie sollten die ALL() Funktion auf der Sammlung von Beziehungen verwenden können, dass für alle Beziehungen in dem Weg zu erzwingen, ist das Eigentum in Frage null.

Gabor Probe Graph verwenden, sollten diese Abfrage arbeiten.

MATCH p = (n {name: 'n1'})-[rs1*]->() 
WHERE ALL(rel in rs1 WHERE rel.relevance_score is null) 
RETURN p 
+1

Danke, daran habe ich nicht gedacht. Eine kleine Bemerkung: Sie sollten 'p' anstelle von' path' zurückgeben. –

+0

Das funktioniert, obwohl ich keine Daten über die Beziehungen zu bekommen scheint. Ich kann Sachen wie 'Beziehungen (p)' tun, aber ich bin nur die Eigenschaften zurück und ich kann Sachen wie die Identifikation oder die Aufkleber erhalten. – WildBill

+0

Ich akzeptiere das, aber ich öffne eine neue Frage, da ich Details zu jedem Teil benötige, aber das habe ich nicht explizit gesagt. http://stackoverflow.com/questions/41895481/how-to-enumerate-nodes-and-relationships-along-path-returned-via-cypher wurde geöffnet, um die Frage zu verfeinern. – WildBill

2

Eine Lösung, die ich denken kann, ist durch alle Beziehungen zu gehen (mit rs*), filtere die ohne die relevance_score Eigenschaft und schau, ob der rs "Pfad" immer noch der selbe ist. (Ich habe "Pfad" zitiert, da es technisch kein Neo4j path ist).

habe ich ein kleines Beispiel Graph:

CREATE 
    (n1:Node {name: 'n1'}), 
    (n2:Node {name: 'n2'}), 
    (n3:Node {name: 'n3'}), 
    (n4:Node {name: 'n4'}), 
    (n5:Node {name: 'n5'}), 
    (n1)-[:REL {relevance_score: 0.5}]->(n2)-[:REL]->(n3), 
    (n1)-[:REL]->(n4)-[:REL]->(n5) 

Der Graph enthält eine einzige relevante Kante zwischen Knoten n1 und n2.

enter image description here

Die Abfrage (beachten Sie, dass ich {name: 'n1'} den Startknoten erhalten verwendet, könnten Sie START node=... verwenden):

MATCH (n {name: 'n1'})-[rs1*]->(x) 
UNWIND rs1 AS r 
WITH n, rs1, x, r 
WHERE NOT exists(r.relevance_score) 
WITH n, rs1, x, collect(r) AS rs2 
WHERE rs1 = rs2 
RETURN n, x 

Die Ergebnisse:

╒══════════╤══════════╕ 
│n   │x   │ 
╞══════════╪══════════╡ 
│{name: n1}│{name: n4}│ 
├──────────┼──────────┤ 
│{name: n1}│{name: n5}│ 
└──────────┴──────────┘ 

Update: siehe die Antwort von InverseFalcon für eine einfachere Lösung.

+0

verpasst Ich habe eine Verfeinerung in den Anmerkungen zur Antwort unten gepostet. Neugierig, wie ich mehr Daten über die resultierenden Komponenten des Pfades bekomme. – WildBill