Я думал, что я пытаюсь придумать альтернативу, которая работает также, если отношения не симметричны , или если вы хотите представить симметрию, оставив направление отношений в своих запросах, а не с двойными отношениями в базе данных (на карту поставлены тысячи байтов, как сказал бы Джек Бауэр). Моя первая мысль была бюстом, но я думаю, что это работает:
MATCH p=(a:Node)-[:KNOWS]-(b:Node)-[r:KNOWS*0..1]-(c:Node)
WHERE NOT (a)-[:KNOWS*3]-() AND NOT (b)-[:KNOWS*3]-()
WITH a, reduce(
allNodes = [], path in collect(p) | allNodes + filter(
n in nodes(path) WHERE NOT n IN allNodes
)
) as allNodes
WHERE length(allNodes) = 2
RETURN a
Когда я запускаю этот запрос в Neo4j console я говорил, что я делаю что-то исключительное (спасибо!), Это говорит Error: org.neo4j.kernel.guard.GuardOperationsCountException: max ops (ops=10001)
. Может быть, это намек на улучшение запроса (?), Но он отлично работает, когда я запускаю его локально.
В принципе я понял, если не
(a)-[:KNOWS]->(b) => (b)-[:KNOWS]->(a)
, то вы можете получить ложные срабатывания с вашим запросом, когда (b:Node)
имеет ровно один исходящие отношения, но это не (a:Node)
и ложноотрицательные при (b:Node)
не имеют исходящих связей.
(a)-[:KNOWS]->(b)-[:KNOWS]->(c) AND a<>c // false positive
(a)-[:KNOWS]->(b) AND NOT (b)-[:KNOWS]->() // false negative
Другой способ думать критериев является то, что шаблон, который вы хотите это) один или два отношения глубоки, б) не является частью более длинной модели, с) содержит только два отдельных узлов, так это то, что Я попытался описать в моей альтернативной версии выше. Первые два критерия были легко сформулированы, но третий был менее очевидным, чем я думал. Я чувствую, что есть, вероятно, гораздо более простой способ, редактировать или комментировать, если вы это видите. (Я сначала попытался использовать distinct
, а не filter()
, но я должен быть смущен, потому что я не мог заставить это работать).
Это отлично работает, если [: KNOWS] всегда симметричен. Если есть случаи, которые не являются симметричными, вы можете получить ложные срабатывания и негативы, см. Http://console.neo4j.org/r/mbm5gc – jjaderberg
В моем случае KNOWS всегда симметричен. Но вы действительно нашли хороший момент в ситуации, когда они не симметричны. Было бы неплохо разместить решение для этого. – dbspace