假设我有两种节点,Person
和Competency
。它们与KNOWS
关系相关。例如:
(:Person {id: 'thiago'})-[:KNOWS]->(:Competency {id: 'neo4j'})
如何查询此架构,找出知道Person
集合中所有节点的所有Competency
?
假设我需要找到知道“java”和“haskell”的每个Person
,我只对知道所有列出的{{1}的节点感兴趣} nodes。
我尝试过这个问题:
Competency
但是我找回了所有知道“java”或“haskell”的match (p:Person)-[:KNOWS]->(c:Competency) where c.id in ['java','haskell'] return p.id;
列表以及知道两者的重复条目。
在查询结尾添加Person
会消除重复项:
count(c)
然后,在这种特殊情况下,我可以迭代结果并过滤掉计数小于2的结果,以获得我想要的节点。
我发现我可以添加连续的match (p:Person)-[:KNOWS]->(c:Competency) where c.id in ['java','haskell'] return p.id, count(c);
子句来继续过滤节点以获得我想要的结果,在这种情况下:
match
这是表达此查询的唯一方法吗?我的意思是,我需要通过连接字符串来创建查询?我正在寻找带参数的固定查询的解决方案。
答案 0 :(得分:2)
with ['java','haskell'] as skills
match (p:Person)-[:KNOWS]->(c:Competency)
where c.id in skills
with p.id, count(*) as c1 ,size(skills) as c2
where c1 = c2
return p.id
答案 1 :(得分:1)
您可以做的一件事是计算所有技能的数量,然后找到技能关系数等于技能数的用户:
MATCH (n:Skill) WITH count(n) as skillMax
MATCH (u:Person)-[:HAS]->(s:Skill)
WITH u, count(s) as skillsCount, skillMax
WHERE skillsCount = skillMax
RETURN u, skillsCount
克里斯
答案 2 :(得分:1)
未经测试,但这可能会解决问题:
match (p:Person)-[:KNOWS]->(c:Competency)
with p, collect(c.id) as cs
where all(x in ['java', 'haskell'] where x in cs)
return p.id;
答案 3 :(得分:1)
这个怎么样......
with ['java','haskell'] as comp_col
match (p:Person)-[:KNOWS]->(c:Competency)
where c.name in comp_col
with comp_col
, p
, count(*) as total
where total = length(comp_col)
return p.name, total
我认为这将适用于您所需要的内容,但如果您以编程方式构建这些查询,则获得的最佳性能可能是连续匹配子句。特别是如果您在构建查询时知道哪些能力最常见/最不常见,那么您可以订购匹配项,以便最不常见的是第一个,最常见的是最后一个。我认为这会让你想要的人最快。
看看有关不同方法的剪切机中的计划分析器的内容会很有趣。