【问题标题】:Neo4j adding json as relationship, Invalid input '{':Neo4j 添加 json 作为关系,无效的输入'{':
【发布时间】:2016-04-09 15:45:14
【问题描述】:

我正在使用 py2neo cypher 来加载节点之间的关系。我想用一个json对象作为这个关系,以后可以查询。这是我的密码查询:

 MATCH (a:OntologyNode),(b:OntologyNode) 
 WHERE a.cid = 'abcat1' 
 AND b.cid = 'abcat2' 
 CREATE (a)-[r:{'operand2': 'Product_Weight', 'operand1': 'Maximum_Weight', 'operator': '>='}]->(b)

这是我的错误:

 InvalidSyntax: Invalid input '{': expected whitespace or a rel type name (line 1, column 111 (offset: 110))

我似乎不喜欢'{',但是有没有办法解决这个问题?我喜欢这个 json 作为关系的原因是能够查询它。

【问题讨论】:

    标签: json neo4j cypher py2neo


    【解决方案1】:

    您可以将 JSON 的键/值对添加为关系上的属性

    MATCH (a:OntologyNode),(b:OntologyNode) 
    WHERE a.cid = 'abcat1' 
    AND b.cid = 'abcat2' 
    CREATE (a)-[r:REL {operand2: 'Product_Weight', operand1: 'Maximum_Weight', operator: '>='}]->(b)
    

    那你就可以这样查询了

    MATCH (:OntologyNode)-[rel:REL]->(:OntologyNode) 
    WHERE rel.operand2 = 'Product_Weight'
    AND rel.operand1 = 'Maximum_Weight'
    AND rel.operator = '>='
    

    如果你真的想使用实际的 JSON 作为关系,那么你可以像这样反引号 JSON 字符串。

    MATCH (a:OntologyNode),(b:OntologyNode) 
    WHERE a.cid = 'abcat1' 
    AND b.cid = 'abcat2' 
    CREATE (a)-[r:`{operand2: 'Product_Weight', operand1: 'Maximum_Weight', operator: '>='}`]->(b)
    

    如果您想将两者结合起来,您始终可以将 JSON 存储在关系上的另一个属性中。

    ...
    create (a)-[r:REL]->(b)
    set r.operand2 = 'Product_Weight'
    , r.operand1 = 'Maximum_Weight'
    , r.operator = '>='
    , r.json = "{operand2: 'Product_Weight', operand1: 'Maximum_Weight', operator: '>='}"
    

    【讨论】:

    • 我真的很喜欢第一种方法。据我所知,您刚刚从 json 中添加了“REL”。但是,当我这样做时,我仍然收到错误。
    • 是的,我添加了REL 是关系类型。我还取消了 JSON 中的键:operand2、operand1 和 operator。
    • 删除键引用的唯一问题是它不是有效的 JSON。否则它会很好用。关于如何解决这个问题的任何想法?
    • 那是因为该示例中的 JSON 是 Neo4j 密码解析器所期望的格式。它使用 JSON,但实际上将键/值对存储为关系对象的属性。您始终可以将原始 JSON 添加为关系的附加属性。我更新了答案,将其作为另一种选择。
    • 在使用 py2neo 和 json 文件读取时仍然出现错误。我可以说的一个原因是它总是将键放在引号中。使用 set then json 作为附加属性也会引发错误。
    【解决方案2】:

    我不清楚您所说的“我想使用 json 对象作为这种关系”是什么意思。 Neo4j 将关系定义为两个节点之间的存储连接,具有文本类型名称和可选的属性映射/字典。

    另请注意,JSON 只是一种符号,而不是类型系统。此外,Cypher 本身不消耗或生成 JSON。

    Cypher 使用的文字映射表示法类似于,但 JSON 不兼容。属性键通常不加引号,除非它们包含特殊字符,使用反引号时。不支持双引号。属性键应被视为标识符,而不是字符串。

    您还说“我喜欢这个 json 作为关系的原因是能够查询它”。 Cypher 不包含 JSON 查询功能,尽管您当然可以查询关系的属性。

    如果您想要的是一个包含属性的关系,那么您需要为您的关系指定一个类型名称并使用 Cypher 映射表示法而不是 JSON 表示法。比如:

    MATCH (a:OntologyNode),(b:OntologyNode) 
    WHERE a.cid = 'abcat1' 
    AND b.cid = 'abcat2' 
    CREATE (a)-[r:RELATES_TO {operand2: 'Product_Weight', 
                              operand1: 'Maximum_Weight', operator: '>='}]->(b)
    

    显然将RELATES_TO 替换为适合您的域的关系名称。

    【讨论】:

      猜你喜欢
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 2023-03-18
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 2016-11-29
      相关资源
      最近更新 更多