Neo4j中使用密码查询的关系缺失

w3nuxt5m  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(152)

我正在Neo4j中使用UNWINDForeach进行Cypher查询,我确定有bug,但我不知道我错在哪里。
我正在构建一个跟踪中包含三个跨度的图,如下所示(在“test.json”中)

[
    {
        "spanId":"3",
        "name": "checkOut",
        "parentId": ["1"],
        "service_name": "svc"
    },
    {
        "spanId":"2",
        "name": "addCart",
        "parentId": ["1"],
        "service_name": "svc"
    },
    {
        "spanId":"1",
        "name": "frontend",
        "service_name": "svc"
    }
]

Span checkOutaddCartfront的子级,因此frontend -> checkOutfrontend -> addCart之间存在父子关系。
同时,这些span都属于“svc”服务,所以它们应该与“svc”有关系,但是frontend遗漏了与“svc”的关系,如下所示

我的Cypher查询如下:

WITH 'file:///test.json' AS url

CALL apoc.load.json(url) YIELD value

MERGE (s:Span {span_id: value.spanId})
ON CREATE SET  s.name=value.name, s.service=value.service_name

WITH s, value
UNWIND value.parentId AS parent
MERGE (p:Span {span_id: parent})
MERGE (p)-[:PARENT_OF]->(s)

WITH s, value, value.service_name AS ki
FOREACH(k IN ki | 
     MERGE (svc:Service{service: value.service_name} )
     MERGE (s)-[:FROM_SERVICE]->(svc)
)

有人能帮我看看我在Cypher查询中做错了什么吗?非常感谢!

shyt4zoc

shyt4zoc1#

问题是在UNWIND语句中,您的frontend对象没有parentId数组,因此在创建与服务的关系之前,没有任何东西可以展开,并且对象会丢失。要解决这个问题,您应该将与服务的关系的创建和合并移动到UNWIND之上。尝试以下操作:

WITH 'file:///test.json' AS url
CALL apoc.load.json(url) YIELD value
MERGE (s:Span {span_id: value.spanId})
ON CREATE SET  s.name=value.name, s.service=value.service_name
WITH s, value, value.service_name AS ki
FOREACH(k IN ki | 
     MERGE (svc:Service{service: value.service_name} )
     MERGE (s)-[:FROM_SERVICE]->(svc)
)
UNWIND value.parentId AS parent
MERGE (p:Span {span_id: parent})
MERGE (p)-[:PARENT_OF]->(s)

相关问题