选择在Neo4j中具有所有关系的节点

时间:2014-11-28 17:55:09

标签: neo4j cypher

假设我有两种节点,PersonCompetency。它们与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

这是表达此查询的唯一方法吗?我的意思是,我需要通过连接字符串来创建查询?我正在寻找带参数的固定查询的解决方案。

4 个答案:

答案 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
  1. 将您想要的能力放入集合中。
  2. 匹配所有具备这些能力的人
  3. 从一开始就获得与能力收集中相同编号的人员的能力计数
  4. 我认为这将适用于您所需要的内容,但如果您以编程方式构建这些查询,则获得的最佳性能可能是连续匹配子句。特别是如果您在构建查询时知道哪些能力最常见/最不常见,那么您可以订购匹配项,以便最不常见的是第一个,最常见的是最后一个。我认为这会让你想要的人最快。

    看看有关不同方法的剪切机中的计划分析器的内容会很有趣。