簡體   English   中英

Neo4j:在節點標簽上具有可變長度和條件的密碼查詢

[英]Neo4j: Cypher Query With Variable Length and Condition on Node Labels

我在尋找什么

使用可變長度關系 (請參見neo4j手冊中的此處 ),可以在兩個節點之間具有一定數量的具有一定標簽的關系。

# Cypher
match (g1:Group)-[:sub_group*]->(g2:Group) return g1, g2

我在尋找與節點相同的東西 ,即一種查詢兩個節點的方法,兩個節點之間的節點數目可變 ,但是節點上的標簽條件而不是關系

# Looking for something like this in Cypher:
match (g1:Group)-->(:Group*)-->(g2:Group) return g1, g2

我將使用這種機制,例如,在組結構中查找組的所有(直接或間接)成員。

# Looking for somthing like this in Cypher:
match (group:Group)-->(:Group*)-->(member:User) return member

以以下結構為例:

group1:Group
   |-------> group2:Group -------> user1:User
   |-------> group3:Group
                  |--------> page1:Page -----> group4:Group -----> user2:User

在這個例子中, user1是其成員的group1group2 ,但user2只是構件group4 ,其它組不是會員,因為非Group標記的節點是介於兩者之間。

抽象化

在Cypher中,更抽象的模式是一種重復運算符 |...|*

# Looking for repeat operator in Cypher:
match (g1:Group)|-[:is_subgroup_of]->(:Group)|*-[:is_member_of]->(member:User) 
return member

有人知道這樣的重復運算符嗎? 謝謝!

可能的解決方案

我發現的一種解決方案是在使用where的節點上使用條件,但我希望那里有更好(或更短)的解決方案!

# Cypher
match path = (member:User)<-[*]-(g:Group{id:1}) 
where all(node in tail(nodes(path)) where ('Group' in labels(node))) 
return member

說明

在上述查詢中, all(node in tail(nodes(path)) where ('Group' in labels(node)))是一個單where條件,它由以下關鍵部分組成:

  • allALL(x in coll where pred) :如果coll所有值的pred為TRUE則為TRUE
  • nodes(path)NODES(path) :返回節點path
  • tail()TAIL(coll) :除第一個元素外的coll –我正在使用它,因為第一個節點是User ,而不是Group

參考

這個怎么樣:

MATCH (:Group {id:1})<-[:IS_SUBGROUP_OF|:IS_MEMBER_OF*]-(u:User)
RETURN DISTINCT u

這將:

  • 查找ID為1的組的所有子樹
  • 僅沿傳入方向遍歷關系IS_GROUP_OF和IS_MEMBER_OF(表示屬於具有ID或其子組之一的組的子組或用戶)
  • 僅返回與子樹中的組具有IS_MEMBER_OF關系的節點
  • 並丟棄重復的結果(屬於樹中多個組之一的用戶將多次出現)

我知道這依賴於關系類型而不是節點標簽,但是恕我直言,這是一種更加圖形化的方法。

讓我知道這是否行得通。

暫無
暫無

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

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