Предположим, у меня есть два типа узлов, Person
и Competency
. Они связаны соотношением KNOWS
. Например:Выберите узлы, которые имеют все отношения в Neo4j
(:Person {id: 'thiago'})-[:KNOWS]->(:Competency {id: 'neo4j'})
Как запросить эту схему, чтобы выяснить все Person
, который знает все узлы набора Competency
?
Предположим, что мне нужно найти все Person
, который знает «Java» и «Haskell», и я заинтересован только в узлах, которые знают все из перечисленных Competency
узлов.
Я попробовал этот запрос:
match (p:Person)-[:KNOWS]->(c:Competency) where c.id in ['java','haskell'] return p.id;
Но я вернусь список всех Person
, который знает, либо «Java» или «Haskell» и дублирующиеся записи для тех, кто знает, как.
Добавление count(c)
в конце запроса устраняет дубликаты:
match (p:Person)-[:KNOWS]->(c:Competency) where c.id in ['java','haskell'] return p.id, count(c);
Затем, в данном конкретном случае, я могу перебирать результат и отфильтровать результаты, что отсчет меньше, чем два, чтобы получить узлов, которые я хочу.
Я узнал, что я мог сделать это, добавляя последовательные match
положения, чтобы фильтровать узлы, чтобы получить результат я хочу, в этом случае:
match (p:Person)-[:KNOWS]->(:Competency {id:'haskell'})
match (p)-[:KNOWS]->(:Competency {id:'java'})
return p.id;
Это единственный способ выразить этот запрос ? Я имею в виду, мне нужно создать запрос путем конкатенации строк? Я ищу решение для фиксированного запроса с параметрами.