การสืบค้นความสัมพันธ์แบบเรียกซ้ำใน Neo4j ด้วย Cypher

ฉันมีฐานข้อมูลกราฟที่สร้างแบบจำลองข้อมูลเมตาสำหรับข้อความและฟิลด์ที่สามารถมีอยู่ในข้อความเหล่านั้น บางฟิลด์อาจเป็น "กลุ่ม" ซึ่งเป็นกลุ่มของฟิลด์อื่นๆ สิ่งที่ฉันพยายามถาม Neo คือ "กลุ่มนี้ใช้ข้อความอะไรบ้าง" ต่อไปนี้เป็นรายการประเภทเส้นทางที่สามารถใช้เพื่อรับจากข้อความไปยังกลุ่ม:

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)

ห่วงโซ่ที่สองเป็นแบบเรียกซ้ำ กล่าวอีกนัยหนึ่ง ส่วน -[:FIELDREF]->(fref)-[:FIELD]->(field)-[:DATATYPE]-(group) สามารถเกิดขึ้นซ้ำแล้วซ้ำอีกก่อนที่จะถึงกลุ่มที่ฉันสนใจในที่สุด ใน.

ดังนั้นสิ่งที่ฉันอยากรู้คือ ฉันจะขอความสัมพันธ์แบบลูกโซ่ซ้ำๆ แทนที่จะเป็นเพียงหลายรายการ (เช่น * หลังชื่อความสัมพันธ์) ในแต่ละองค์ประกอบในเส้นทางได้อย่างไร

โดยสรุป คุณสามารถเข้าถึงกลุ่มจากข้อความโดยข้ามความสัมพันธ์ [:INLINE] ซึ่งสามารถติดตามเชน "fieldref-field-datatype-group" จำนวน n จำนวน .. หรือคุณสามารถเข้าถึงกลุ่มจาก ข้อความโดยการสำรวจ n จำนวนเชน "fieldref-field-datatype-group"

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

ดังนั้นฉันต้องการบางอย่างเช่น [?:INLINE]-> 0..n ของ (fieldref-field-datatype-group) chains

มีความคิดอะไรบ้าง?


person Kevin Hoffman    schedule 23.05.2013    source แหล่งที่มา


คำตอบ (1)


ตามการอ้างอิง Cypher ที่ http://docs.neo4j.org/chunked/milestone/query-match.html ...

12.2.13. ความสัมพันธ์ของความยาวที่แปรผันได้ โหนดที่เป็นจำนวนตัวแปรของความสัมพันธ์→การกระโดดของโหนดสามารถพบได้โดยใช้ไวยากรณ์ต่อไปนี้: -[:TYPE*minHops..maxHops]-> minHops และ maxHops เป็นทางเลือกและมีค่าเริ่มต้นเป็น 1 และอนันต์ตามลำดับ เมื่อไม่มีการกำหนดขอบเขต จุดอาจถูกละเว้น

ตัวอย่างของสิ่งที่ฉันคิดว่าคุณต้องการอยู่ด้านล่าง ฉันตั้งขั้นต่ำไว้ที่สอง

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

คุณสามารถทดสอบคำค้นหานี้แบบคำต่อคำได้ที่ http://console.neo4j.org

person Manuel Hernandez    schedule 23.05.2013
comment
ใช่ ฉันรู้เกี่ยวกับเครื่องหมายดอกจัน จริงๆ แล้วฉันพยายามที่จะซับซ้อนเกินไปและอธิบายรูปร่างที่แน่นอนเมื่อฉันบอก Neo ได้ว่าฉันต้องการเส้นทาง ความยาวเท่าใดก็ได้ จากข้อความไปยังกลุ่ม เช่นนี้: msg-[?:INLINE|FIELDREF| สนาม|ประเภทข้อมูล*]->n - person Kevin Hoffman; 24.05.2013