簡體   English   中英

在 Neo4j 中基於 Time 屬性在節點之間創建有向邊

[英]Creating directed edges between nodes based on Time property in Neo4j

我是 Neo4j 和 Cypher 的新手,在將我們公司的關系數據庫轉換為基於圖形的模型時,我遇到了一個問題,我將不勝感激。

我的模型中有一個類型為 person 的節點,如下所示:

 (:Person {Fname: 'John', catID: 1})
 (:Person {Fname: 'George', catID: 2})
 (:Person {Fname: 'Natalie', catID: 3})

......

我也有這樣的基於時間的類別節點:

(:Category {Id: 1, Date: '2015-02-05'})
(:Category {Id: 1, Date: '2015-01-05'})
(:Category {Id: 1, Date: '2015-03-10'})
(:Category {Id: 3, Date: '2014-03-10'})
(:Category {Id: 3, Date: '2015-05-10'})

......

現在我想創建從每個人到其類別中具有最小日期的節點的直接邊。 我在上面的例子中的意思是:

 (:Person {Fname: 'John', catID: 1}) --->  (:Category {Id: 1, Date: '2015-01-05'})

 (:Person {Fname: 'Natalie', catID: 3}) --->  (:Category {Id: 3, Date: '2014-03-10'})

之后,我想根據它們的 Date 屬性按升序在每個類別中的節點之間創建有向邊。 我的意思是:

 (:Category {Id: 1, Date: '2015-01-05'}) ---> (:Category {Id: 1, Date: '2015-02-05'}) ---> (:Category {Id: 1, Date: '2015-03-10'})

 (:Category {Id: 3, Date: '2014-03-10'}) ---> (:Category {Id: 3, Date: '2015-05-10'})

做這些事情所需的密碼是什么。 非常感謝提前

以下是您如何完成問題的第一部分,將人們附加到具有最短日期的相應類別節點:

MATCH (p:Person)
MATCH (c:Category)
WHERE p.catID = c.Id
WITH p, c
ORDER BY p.Fname, c.Date
WITH p, HEAD(COLLECT(c)) AS most_recent
MERGE (p)-[:IN_CATEGORY]->(most_recent)

現在我們可以這樣做:

MATCH (p:Person)-[:IN_CATEGORY]->(c:Category)
RETURN p.Fname, c.Date

我們得到了結果:

p.Fname   c.Date
John      2015-01-05
Natalie   2014-03-10

要回答您的第二個問題,我們可以這樣做:

MATCH (c:Category) WITH c
ORDER BY c.Id, c.Date
WITH c.Id AS id, 
     COLLECT(c) AS categories, 
     COUNT(c) AS count 
UNWIND range(1, count - 1) AS idx
WITH categories[idx - 1] AS from , categories[idx] AS to
CREATE (from)-[:NEXT]->(to);

我從邁克爾的回答中竊取了一些想法。 :) 您現在可以編寫這樣的查詢:

MATCH p = (:Person)-[:IN_CATEGORY]->(:Category)-[:NEXT*]->(:Category)
RETURN p

在此處查看成品: http : //console.neo4j.org/r/999rzg

這幾乎很簡單:)

創建按時間戳排序的節點鏈表

MATCH (c:Category)
WITH c order by c.Date
// ordered list
WITH collect(c) as cats 
// index for collection
UNWIND range(1,size(cats)-1) as idx
// subsequent entries
WITH cats[idx-1] as first, cats[idx] as second
CREATE (first)-[:NEXT]->(second)
RETURN count(*);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM