Neo4j / CYPHER:如何有效地从节点,其关系和目标节点查询某些属性?

时间:2015-01-16 13:56:42

标签: java rest neo4j cypher

我想查询一组节点,这些节点是其属性的子集,它们的关系以及具有一些属性的目标节点(来自Java与CYPHER通过REST)。我的想法如下:

MATCH a WHERE id(a) IN {ids}
OPTIONAL MATCH (a)-[r]->(b)
RETURN id(a), a.name, a.attr1, r.attr2, id(b), b.name

现在我为每个关系得到一个“行”,但它包含多个每个节点“a”的数据。

是否有更好的方法来进行此类查询,以便节点“a”的属性只传输一次?一个想法是进行2个单独的查询,但如果WHERE条件稍微复杂一些,则可能会执行两次。

2 个答案:

答案 0 :(得分:3)

使用收集功能。

http://neo4j.com/docs/stable/query-aggregation.html#aggregation-collect

MATCH a WHERE id(a) IN {ids}
OPTIONAL MATCH (a)-[r]->(b)
RETURN id(a), a.name, a.attr1, collect([r.attr2, id(b), b.name])

答案 1 :(得分:1)

来自@ frant.hartm的回答是完全正确的!但是,如果您想使用稍微不同的方法,您可以考虑以下内容:

想象一下下面的图表:

create 
    (p1:Employee {name:"John"})-[:works_at]->(e1:Employer {name:"Microsoft"}),
    (p1)-[:works_at]->(e2:Employer {name:"Oracle"}),
    (p2:Employee {name:"Jim"})-[:works_at]->(e1),
    (p2)-[:works_at]->(e2)
return p1, p2, e1, e2

// RESULT:
// (Jim)-works_at->(Microsoft)
// (Jim)-works_at->(Oracle)
// (John)-works_at->(Microsoft)
// (John)-works_at->(Oracle)

为了COLLECT获得不错的输出格式,您还可以使用文字地图,如下例所示:

MATCH 
    (a:Employee)-[r:works_at]->(e:Employer) 
WITH 
    a, 
    r, 
    COLLECT({name:e.name, id:ID(e)}) AS employers
WITH 
    a, 
    COLLECT({ type : type(r), employers : employers}) AS employerRels
WITH 
    { name : a.name, id: ID(a), employers : employerRels} AS employee
RETURN 
    employee

然后,令人敬畏的结果将很好地格式化JSON,如下所示:

{
  "name": "Jim",
  "id": 227,
  "employers": [
    {
      "type": "works_at",
      "employers": [
        {
          "name": "Oracle",
          "id": 226
        }
      ]
    },
    {
      "type": "works_at",
      "employers": [
        {
          "name": "Microsoft",
          "id": 225
        }
      ]
    }
  ]
},
{
  "name": "John",
  "id": 224,
  "employers": [
    {
      "type": "works_at",
      "employers": [
        {
          "name": "Oracle",
          "id": 226
        }
      ]
    },
    {
      "type": "works_at",
      "employers": [
        {
          "name": "Microsoft",
          "id": 225
        }
      ]
    }
  ]
}