[英]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
是其成員的group1
和group2
,但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條件,它由以下關鍵部分組成:
all
: ALL(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
這將:
我知道這依賴於關系類型而不是節點標簽,但是恕我直言,這是一種更加圖形化的方法。
讓我知道這是否行得通。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.