2015-01-16 71 views
1

我想要查詢一組節點的屬性,它們的關係和目標節點的子集以及它們的一些屬性(從CYPHER到Java的Java)。我的想法是以下幾點:Neo4j/CYPHER:如何有效地查詢節點及其關係和目標節點的某些屬性?

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條件稍微複雜一點,它可能會執行兩次。

回答

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 
     } 
     ] 
    } 
    ] 
} 
相關問題