我有實體人(姓名,年齡)和項目(名稱)的數據庫。 我可以在cypher中查詢指定我是人還是項目的數據庫嗎?Neo4j查詢節點屬性。
例如考慮我爲每個這兩個實例:
節點(名=愛麗絲,年齡= 20) 節點(名=鮑勃,年齡= 31)
節點(名= PROJECT1) 節點(名稱= project2)
- 我想知道,有沒有什麼方法可以說我只是說project1,它告訴我這是一個項目。
- 或我查詢愛麗絲,它說我這是一個人?
感謝
我有實體人(姓名,年齡)和項目(名稱)的數據庫。 我可以在cypher中查詢指定我是人還是項目的數據庫嗎?Neo4j查詢節點屬性。
例如考慮我爲每個這兩個實例:
節點(名=愛麗絲,年齡= 20) 節點(名=鮑勃,年齡= 31)
節點(名= PROJECT1) 節點(名稱= project2)
- 我想知道,有沒有什麼方法可以說我只是說project1,它告訴我這是一個項目。
- 或我查詢愛麗絲,它說我這是一個人?
感謝
您應該使用節點標籤(如Person
和Project
)來表示節點 「類型」。
例如,創建一個人與一個項目:
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'})-()
...
所以你的使用情況是按名稱搜索的東西,這些東西可以是多種類型的,而不是單一類型的。
只需注意,一般來說,這不是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標籤)。
謝謝,你的回答是正確的。我在想圖形數據庫是這種查詢的一個選項。我正在探索回答高水平搜索的選項('X'是人,地點,項目等)。您建議我尋找什麼來回答這些問題? – Eli
例如,谷歌如何知道湯姆漢克斯是一個人,並將我返回給某人的詳細信息? – Eli
您可能需要查看ElasticSearch,但通常我認爲您正在尋找使用倒排索引的db解決方案。至於谷歌,谷歌不僅僅使用單一的數據庫解決方案,他們所做的大部分工作都是自行開發的(並引入或啓發了幾種當前的技術)。當涉及到不知情的文本匹配時,使用倒排索引的dbs可能是最好的開始。他們還可以根據各種標準提高搜索結果,這聽起來與您所要求的相似。 – InverseFalcon
@Eli您可能需要查看[Cypher參考卡](https://neo4j.com/docs/cypher-refcard/current/),重點在標籤部分。 – InverseFalcon
@InverseFalcon謝謝你的回答。我的問題更高一級。例如,我查詢術語「X」,我想知道它是一個關係的節點或屬性的屬性。然後我知道'X'這個詞是人或項目。密碼有這個能力嗎? – Eli
@Eli:我(@cybersam)最近更新了我的答案,它表明您可以使用LABELS功能來查找任何節點的標籤。 – cybersam