Ваш синтаксис для меня немного странный, поэтому я предполагаю, что вы используете более старую версию 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
Какая версия Neo4j вы используете? Пропущенная скобка на вашем совпадении не выглядит так, как она должна работать в Neo4j 3.x. – InverseFalcon