Mengkueri Rantai Hubungan Rekursif di Neo4j dengan Cypher

Saya memiliki database grafik yang memodelkan metadata untuk pesan dan bidang yang dapat dimuat dalam pesan tersebut. Beberapa field tersebut dapat berupa “grup” yang merupakan grup dari field lain. Yang ingin saya tanyakan pada Neo adalah "pesan apa yang menggunakan grup ini?". Berikut ini adalah daftar tipe jalur yang dapat digunakan untuk berpindah dari pesan ke grup:

message-[:INLINE]->group  (the fields of a group are used inline on a message)
message-[:FIELDREF]->(fref)-[:FIELD]->(field)-[:DATATYPE]->group (the group is used as a data type by a field on the message)

Rantai kedua bersifat rekursif. Dengan kata lain, segmen -[:FIELDREF]->(fref)-[:FIELD]->(field)-[:DATATYPE]-(group) dapat terjadi berulang kali sebelum akhirnya mencapai grup yang saya minati di dalam.

Jadi, yang ingin saya ketahui adalah, bagaimana cara meminta rantai hubungan yang berulang, bukan hanya kelipatan (misalnya * setelah nama hubungan) pada setiap elemen individual di jalur?

Ringkasnya, Anda bisa masuk ke grup dari sebuah pesan dengan melintasi hubungan [:INLINE], yang kemudian dapat mengikuti n jumlah rantai "fieldref-field-datatype-group".. ATAU Anda bisa masuk ke grup dari a pesan dengan melintasi n jumlah rantai "fieldref-field-datatype-group".

START group=node({sourceGroupId})
... ? ? ? ...

Jadi saya ingin sesuatu seperti [?:INLINE]-> 0..n rantai (fieldref-field-datatype-group).

Ada pemikiran?


person Kevin Hoffman    schedule 23.05.2013    source sumber


Jawaban (1)


Menurut referensi Cypher di http://docs.neo4j.org/chunked/milestone/query-match.html ...

12.2.13. Hubungan panjang variabel Node yang merupakan jumlah variabel hubungan→node hop away dapat ditemukan menggunakan sintaks berikut: -[:TYPE*minHops..maxHops]->. minHops dan maxHops masing-masing opsional dan default ke 1 dan tak terhingga. Jika tidak ada batas yang diberikan, titik-titik tersebut dapat dihilangkan.

Contoh dari apa yang menurut saya Anda cari ada di bawah. Saya menetapkan minimum pada dua.

start n=node:node_auto_index(name='Neo') match n-[r:KNOWS*2..]-m return n as Neo,r,m

Anda dapat menguji kueri ini kata demi kata di http://console.neo4j.org

person Manuel Hernandez    schedule 23.05.2013
comment
Ya, saya tahu tentang tanda bintang itu. Saya sebenarnya mencoba menjadi terlalu rumit dan mendeskripsikan bentuk yang tepat padahal saya bisa saja memberi tahu Neo bahwa saya menginginkan jalur apa pun, berapa pun panjangnya, dari pesan ke grup, seperti ini: msg-[?:INLINE|FIELDREF| BIDANG|TIPE DATA*]-›n - person Kevin Hoffman; 24.05.2013