2017-04-11 56 views
0

我有一組標記爲Person和City的節點。節點citiy有兩個屬性Name和isInAustralia。一個人可以與City節點建立關係'hasHouse'關係。一個人可以擁有多個房屋在結果集中添加另一列而不是UNION

我想檢索數據的格式如下: 姓名|| CityInAustralia || CityOutside澳大利亞

假設一個人在澳大利亞的A,D,E市擁有房屋,在澳大利亞以外的城市B,C擁有房屋。

我得到的結果是:

亞當---- ----一乙

亞當---- d -----乙

亞當--- -E ----乙

亞當---- -----甲ç

亞當---- ---- dç

亞當---- E-- --- C

我已經嘗試了以下書面查詢:

Match(person:Person{Name:"Adam"})-[rel:hasHouseIn]->(city:City) 
where city.isInAustralia="true" 
optional match (person:Person{Name:"Adam"})-[rel:hasHouseIn]-> 
(cityOutside:City) 
where city.isInAustralia="false" 
return person.Name,City.Name as CityInAustralia ,cityOutside.Name as 
CityOutsideAustralia 

我想要的結果是這樣的:

名稱---------- CityInAustralia -------- - CityOutsideAustralia


Adam ------------ A -------------------------- --- B


亞當------------ d -------------------------Ç


亞當------------ E -------------------------空白

我想得到一個結果爲當我們在sql服務器上應用左外連接時,我們會得到什麼,其中Name將成爲我們將加入的列。

+0

你沒有真正地說過什麼是錯的 - 你得到了什麼結果,爲什麼它是無效的? –

+0

但是在SQL中做外連連工作的那種方式呢?這也不會在CityInAustralia和CityOutsideAustralia的所有價值之間產生笛卡爾積嗎?在等效的SQL語句中沒有任何內容會按照您描述的方式與列結果配對。 – InverseFalcon

+0

在這裏,我有**亞當**的共同點,但讓我們說,而不是名稱,我們有SSN(Socail安全號碼) – darshitj2

回答

2

我並不真正知道你在做什麼 - 查詢不會像你有重複的標識符一樣工作(rel),所以你不會得到任何結果。而且 - 如果你有 '亞當' 有3房(A,d,E)在澳大利亞和2外面(B,C),你會得到:

A --> B 
A --> C 
D --> B 
D --> C 
E --> B 
E --> C 

的Neo4j不能確定哪個cityOutside應與cityInAustralia一起顯示,因爲這必須是隨機猜測,這看起來像後處理工作。這將讓你我上面指出的結果的查詢是:

MATCH (person:Person{Name:"Adam"})-[:hasHouseIn]->(city:City {IsInAustralia:true}) 
OPTIONAL MATCH (person)-[:hasHouseIn]->(cityOutside:City {IsInAustralia:false}) 
RETURN 
    person.Name, 
    city.Name AS CityInAustralia, 
    cityOutside.Name AS CityOutsideAustralia 

就個人而言,我會用Collect,並得到兩個數組等你拿:

CityInsideAustralia: [A,D,E], 
CityOutsideAustralia: [B,C] 

所以你只能得到每一個結果Person

MATCH (person:Person{Name:"Adam"})-[:hasHouseIn]->(city:City {IsInAustralia:true}) 
OPTIONAL MATCH (person)-[:hasHouseIn]->(cityOutside:City {IsInAustralia:false}) 
RETURN 
    person.Name, 
    COLLECT(DISTINCT city.Name) AS CityInAustralia, 
    COLLECT(DISTINCT cityOutside.Name) AS CityOutsideAustralia 

NB。我正在使用以下數據集:

CREATE 
    (p:Person {Name:'Adam'})-[:hasHouseIn]->(:City {IsInAustralia:true, Name:'A'}), 
    (p)-[:hasHouseIn]->(:City {IsInAustralia:true, Name:'D'}), 
    (p)-[:hasHouseIn]->(:City {IsInAustralia:true, Name:'E'}), 
    (p)-[:hasHouseIn]->(:City {IsInAustralia:false, Name:'B'}), 
    (p)-[:hasHouseIn]->(:City {IsInAustralia:false, Name:'C'}) 
+0

感謝@chris的快速響應。是的,我已經嘗試使用收集 但我想結果是在我有一排城市的格式。我不在乎Adam出現的次數。我希望我的數據在excel中被丟棄,如果我使用Collect,當有成千上萬的這樣的人時,它在單元格中看起來不會很好,並且會很繁瑣地閱讀 – darshitj2

+0

通過所有方法忽略「COLLECT」位 - I補充說,我假設了你的用例,我應該清楚一點:o - 我的錯! –

相關問題