2016-11-10 3 views
1

У меня есть упрощенный график Neo4j (старая версия 2.x) как изображение с 'определяет' и 'те же' ребра. Предположим, что номер на крае define является свойством на краеФильтрация узлов на двух путях шифрования

Запросов Я хотел бы работать, является:

1) Найти узлы defined оба А и В - Requried результата: C, C, D

START A=node(885), B=node(996) MATCH (A-[:define]->(x)<-[:define]-B) RETURN DISTINCT x

Выше работ и возвращает C и D. Но я хочу C дважды, так как его определено дважды. Но без четкости по х он возвращает все пути от A до B.

2) Найти узлы, которые НЕ (определены как A, B OR, определены как A, B, а связаны через один и тот же край) - Требуемый результат: G

что-то вроде:

R1: MATCH (A-[:define]->(x)<-[:define]-B) RETURN DISTINCT x

R2: MATCH (A-[:define]->(e)-(:similar)-(f)<-[:define]-B) RETURN e,f

(узлов определяется - (R1 + R2))

3) Найдите «средние» узлы, которые не имеют соответствующих вызовов от А и В - Необходимый результат: C, G

Я хочу вывести C из-за 1 define (либо 45/46), что делает не совпадающий определить из B. Также выход G, потому что нет никакого define к G из В. enter image description here

Цените любую помощь по этому вопросу!

+0

Какая версия Neo4j вы используете? Пропущенная скобка на вашем совпадении не выглядит так, как она должна работать в Neo4j 3.x. – InverseFalcon

ответ

1

Ваш синтаксис для меня немного странный, поэтому я предполагаю, что вы используете более старую версию Neo4j. Однако мы должны использовать те же подходы.

Для # 1, ваш предлагаемый матч без четкой работы должен работать. Единственное, что я вижу, это добавить отсутствующую скобку вокруг переменных A и B.

START A=node(885), B=node(996) 
MATCH (A)-[:define]->(x)<-[:define]-(B) 
RETURN x 

Кроме того, я не уверен, что вы подразумеваете под «возвращает все пути от А до Б.» Можете ли вы пояснить это и представить пример вывода?

Что касается №2, нам понадобится несколько частей для этого запроса, соответственно разделив их на СО.

START A=node(885), B=node(996) 
MATCH (A)-[:define]->(x)<-[:define]-(B) 
WITH A, B, COLLECT(DISTINCT x) as exceptions 
OPTIONAL MATCH (A)-[:define]->(x)-[:same]-(y)<-[:define]-(B) 
WHERE x NOT IN exceptions AND y NOT IN exceptions 
WITH A, B, exceptions + COLLECT(DISTINCT x) + COLLECT(DISTINCT y) as allExceptions 
MATCH (aNode) 
WHERE aNode NOT IN allExceptions AND aNode <> A AND aNode <> B 
RETURN aNode 

Кроме того, вы действительно должны использовать метки на своих узлах. Окончательный матч будет соответствовать всем узлам вашего графика и в противном случае придется отфильтровать.

EDIT

Что касается вашего требования # 3, функция SIZE() будет очень полезным здесь, как вы можете получить размер сопоставления с образцом, и он покажет вам количество вхождений этого шаблона.

Подход по этому запросу состоит в том, чтобы сначала получить набор узлов, определенных A или B, затем отфильтровать до узлов, где число: определяет отношения из A, не равны числу: определяет отношения из B ,

Хотя мы хотели бы использовать что-то вроде UNION WITH, чтобы получить объединение узлов, определенных A, и объединить их с узлами, определенными B, поддержка UNION Neo4j слаба прямо сейчас, поскольку это не позволяет вы выполняете какие-либо дополнительные операции после того, как UNION произойдет, поэтому вместо этого мы должны прибегнуть к добавлению обоих наборов узлов в одну и ту же коллекцию, а затем разворачиваем их обратно в строки.

START A=node(885), B=node(996) 
MATCH (A)-[:define]->(x) 
WITH A, B, COLLECT(x) as middleNodes 
MATCH (B)-[:define]->(x) 
WITH A, B, middleNodes + COLLECT(x) as allMiddles 
UNWIND allMiddles as middle 
WITH DISTINCT A, B, middle 
WHERE SIZE((A)-[:define]->(middle)) <> SIZE((B)-[:define]->(middle)) 
RETURN middle 
+0

Спасибо большое за ваш ответ. Глядя на это, я понял, что тестовый пример я не обрабатываю, поэтому обновил свой вопрос с запросом №3. оцените ваш вклад в это. – kami

+0

Обновлен для предоставления запроса №3 и объяснения подхода. – InverseFalcon

+0

Не следует ли переименовывать 'middleNodes + COLLECT (x)' в 'WITH A, B, middleNodes + COLLECT (x)' в 'AS'? – kami

Смежные вопросы