2016-09-22 340 views
0

我有實體人(姓名,年齡)和項目(名稱)的數據庫。 我可以在cypher中查詢指定我是人還是項目的數據庫嗎?Neo4j查詢節點屬性。

例如考慮我爲每個這兩個實例:

節點(名=愛麗絲,年齡= 20) 節點(名=鮑勃,年齡= 31)

節點(名= PROJECT1) 節點(名稱= project2)

- 我想知道,有沒有什麼方法可以說我只是說project1,它告訴我這是一個項目。

- 或我查詢愛麗絲,它說我這是一個人?

感謝

回答

2

您應該使用節點標籤(如PersonProject)來表示節點 「類型」。

例如,創建一個人與一個項目:

CREATE (:Person {name: 'Alice', age: 20}) 
CREATE (:Project {name: 'project1'}) 

要查找的項目(S)命名爲「弗雷德」:

MATCH (p:Project {name: 'Fred'}) 
RETURN p; 

爲了得到節點的標籤的集合n,你可以調用LABELS(n)函數。然後,您可以查看該集合以查看您正在查找的標籤是否在該標籤中。例如,如果你的Cypher查詢某種方式獲取節點n,那麼這個片段將返回n當且僅當它有Person標籤:

. 
. 
. 
WHERE 'Person' IN LABELS(n) 
RETURN n; 

[增訂]

如果你想找到的所有節點與「弗雷德」的name屬性值:

MATCH (n {name: 'Fred'}) 
... 

如果你想找到「弗雷德」的名稱屬性值的所有關係:

MATCH()-[r {name: 'Fred'})-() 
... 

如果要在單個查詢中匹配兩個查詢,則有多種方法可以執行此操作,具體取決於您的確切用例。例如,如果你想匹配的節點和關係的笛卡爾積:

OPTIONAL MATCH (n {name: 'Fred'}) 
OPTIONAL MATCH()-[r {name: 'Fred'})-() 
... 
+0

@Eli您可能需要查看[Cypher參考卡](https://neo4j.com/docs/cypher-refcard/current/),重點在標籤部分。 – InverseFalcon

+0

@InverseFalcon謝謝你的回答。我的問題更高一級。例如,我查詢術語「X」,我想知道它是一個關係的節點或屬性的屬性。然後我知道'X'這個詞是人或項目。密碼有這個能力嗎? – Eli

+0

@Eli:我(@cybersam)最近更新了我的答案,它表明您可以使用LABELS功能來查找任何節點的標籤。 – cybersam

2

所以你的使用情況是按名稱搜索的東西,這些東西可以是多種類型的,而不是單一類型的。

只需注意,一般來說,這不是Neo4j的目的。通常在Neo4j查詢中,您知道要搜索的事物的類型,並且您正在探索該事物(或事物)之間的關係以找出關聯或從中派生的數據。

這就是說,有辦法做到這一點,但它是值得經歷的用例休息,看是否Neo4j的是真的,你現在要做的

當你準備什麼是最好的工具通過屬性查詢,您可能希望對標籤/屬性或標籤/屬性上的索引進行唯一約束。請注意,你需要一個標籤和一個屬性的組合;你不能盲目地要求一個有屬性的節點,而不指定標籤並獲得良好的性能,因爲它必須掃描數據庫中的所有節點(Neo4j中有一些較舊的手動索引,但我不確定是否這些將繼續得到支持;模式索引由開發人員推薦)。

有一個解決方法,因爲Neo4j允許在同一個節點上有多個標籤。如果您只希望按名稱查詢某些類型(例如,只有項目和人員),則可以創建一個:命名標籤,並在所有項目和:人員節點(以及應該應用的任何其他標籤)上設置該標籤, 。然後你可以在Named.name上創建一個索引。這樣,你的查詢將是這樣的:

MATCH (n:Named) 
WHERE n.name = 'blah' 
WITH LABELS(n) as types 
WITH FILTER(type in types WHERE type <> 'Named') as labels 
RETURN labels 

請記住,如果一個名字應該是節點類型中是唯一的,你沒有指定,所以它可能對於可能:人或一:項目或多個:有同名的人,不確定這將如何影響你應該發生的事情。如果每一個命名的東西都應該有一個唯一的名字,你應該在Named.name上創建一個唯一的約束(儘管如此,它仍然在確保你創建的每個節點都應該是:Named在創建時應用了:Named標籤)。

+0

謝謝,你的回答是正確的。我在想圖形數據庫是這種查詢的一個選項。我正在探索回答高水平搜索的選項('X'是人,地點,項目等)。您建議我尋找什麼來回答這些問題? – Eli

+0

例如,谷歌如何知道湯姆漢克斯是一個人,並將我返回給某人的詳細信息? – Eli

+0

您可能需要查看ElasticSearch,但通常我認爲您正在尋找使用倒排索引的db解決方案。至於谷歌,谷歌不僅僅使用單一的數據庫解決方案,他們所做的大部分工作都是自行開發的(並引入或啓發了幾種當前的技術)。當涉及到不知情的文本匹配時,使用倒排索引的dbs可能是最好的開始。他們還可以根據各種標準提高搜索結果,這聽起來與您所要求的相似。 – InverseFalcon

相關問題