2015-01-25 3 views
2

У меня есть график, содержащий два типа узлов (объекты и куски) и два типа ссылок (аналогичные и содержащие). Некоторые части сделаны из кусков.Cypher Дополнительное совпадение

Я хотел бы извлечь путь к каждой части, начиная с набора объектов.

MATCH (o:Object) 
WITH o 
OPTIONAL MATCH path = (p:Piece) <-[:contains*]- (o) -[:similarTo]- (:Object) 
RETURN path 

Вышеупомянутый запрос возвращает только часть деталей. В возвращаемом графе некоторые объекты напрямую не соединяются с какими-либо частями, последние не возвращаются, хотя они действительно делают!

я могу изменить запрос на:

MATCH (o:Object) -[:contains*]-> (p:Piece) 
OPTIONAL MATCH (o) –[:similarTo]- (:Object) 

Однако мне не удалось вернуть весь путь для этого запроса, который мне нужно вернуть коллекцию узлов и связей с:

WITH rels(path) as relations , nodes(path) as nodes 
UNWIND relations as r unwind nodes as n 
RETURN {nodes: collect(distinct n), links: collect(distinct {source: id(startNode(r)), target: id(endNode(r))})} 

Буду признателен за любую рекомендацию.

ответ

2

Может, что-то вроде этого сделать трюк?

Я создал небольшой граф, представляющий объекты и фигуры здесь: http://console.neo4j.org/r/abztz4

Execute различные запросы с UNION ALL

Здесь вы будете сочетать два случая использования в одном наборе путей:

MATCH (o:Object) 
WITH o 
OPTIONAL MATCH p=(o)-[:CONTAINS]->(piece) 
RETURN p 
UNION ALL 
MATCH (o:Object) 
WITH o 
OPTIONAL MATCH p=(o)-[:SIMILAR_TO]-()-[:CONTAINS]->(piece) 
RETURN p