Исключая "симметричные" результаты в Neo4j - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу запросить график Neo4j для структуры, которая включает два взаимозаменяемых узла, но я не хочу два уникальных ответа для каждого из "симметричных" ответов.

Как мне выразить в Cypher, что два узла взаимозаменяемы?

Пример:

Я хочу найти следующую структуру в графе с помощью следующего запроса:

MATCH (c:Customer)-[]->(p:Purchase)
MATCH (c:Customer)-[]->(q:Purchase)
MATCH (p)-[]->(m:Company)
MATCH (q)-[]->(m:Company)
RETURN DISTINCT c, p, q, m

the query

По умолчанию Neo4j возвращает следующие два графика:

A symmetric graph Another symmetric graph

(т. Е. Назначение p и q на Purchase1 и Purchase2 обратное)

Как выразитьчто элементы p и q в моем запросе являются взаимозаменяемыми, и мне нужен только один из приведенных выше ответов?

1 Ответ

0 голосов
/ 07 февраля 2019

Чтобы избежать такого рода результатов, у вас обычно есть неравенство, основанное на идентификаторах узлов:

WHERE id(p) < id(q)

Тем не менее, вы можете сформировать этот запрос немногочище, как это (при условии, что вы хотите, чтобы все покупки между клиентом и компанией были сделаны как минимум двумя покупками, сделанными от этого клиента к компании):

MATCH (c:Customer)-->(p:Purchase)-->(m:Company)
WITH c, m, collect(p) as purchases, count(p) as purchaseCount
WHERE purchaseCount >= 2
RETURN c, m, purchases
...