2017-04-19 152 views
0

想象一個填充了關於個人數據的圖。每個節點都有一個名爲「age」的屬性。現在我想返回一個包含「年齡」不同值的節點樣本,因此如果每個年齡在0到90之間的節點都有一個節點,則樣本大小爲91.Neo4j/Cypher - 通過不同的屬性值返回節點

我該如何實現這一點通過密碼?

我真正想要做的是恢復一定量的隨機元素,每個元素與「年齡」的獨特價值,因此只要獲得每個不同的屬性值沒有相應的節點是不夠的。

+0

這是您必須支持的常見用例,還是隻是一次性查詢?您可能需要考慮對模型進行更改以更好地支持此類查詢的快速執行 – InverseFalcon

+0

數據中的年齡也是靜態的,或者年齡與出生日期相關,所以年齡隨着時間的推移而增加? – InverseFalcon

+0

這是一個常見用例,數據是靜態的。我沒有建模數據庫,所以改變數據組織將是。 – rinderwahn

回答

1

這可能會爲你工作:

MATCH (p:Person) 
RETURN p.age AS age, COLLECT(p)[TOINT(rand() * COUNT(p))] AS person; 

查詢收集所有誰擁有在DB每個不同年齡的人,並挑選一個隨機各年齡。

0

如果你擁有或能獲得更改圖形的能力,你可能要提取出個人的年齡到:年齡節點(這隻能是因爲年齡在您的數據是靜態的)。

APOC程序有一個categorization refactoring procedure可以幫助在這裏。

這種方式來獲得一個人各年齡,你只是匹配所有上:年齡節點,get one connected node for each of them

編輯

至於讓每個年齡段隨機的選擇,我們可以使用收集和抓住一個隨機指數cybersam的做法。

隨着APOC程序,我們還可以選擇使用apoc.coll.randomItem()抓住從一個集合中的隨機項目的選項。它基本上是在引擎蓋下做同樣的事情。

完整的查詢(假設你有不同的:年齡節點(與同向關係「年齡」屬性):個人節點)應該是這樣的:

MATCH (age:Age)<-[:HasAge]-(p:Person) 
RETURN age.age as age, apoc.coll.randomItem(collect(p)) as randomPerson 

你提到需要「一定的隨機元素數量「,每個元素都有不同的年齡,所以我們可以修改上面的查詢來收集randomPersons-per-age,並使用apoc.coll.randomItems()來獲取您需要的很多隨機條目。

MATCH (age:Age)<-[:HasAge]-(p:Person) 
WITH age, apoc.coll.randomItem(collect(p)) as randomPerson 
RETURN apoc.coll.randomItems(collect(randomPerson), {numberOfItemsDesired}) as randomPeople 
+0

不錯的建議。但是,這不能保證隨機結果。 – cybersam

+0

是的。更新了我的答案,包括每個年齡段的隨機選擇(每個人都有不同的年齡),隨機選擇不同年齡的隨機人員需要多少人。 – InverseFalcon