Neo4j N-三元组到密码文本的转换

Neo4j N-三元组到密码文本的转换,neo4j,cypher,n-triples,Neo4j,Cypher,N Triples,我有一个N-Triples转储,我想将其转换为Cypher文本,这样就可以直接加载到Neo4j数据库中。 对于像rdf syntax ns#type这样的简单本体,我可以使用脚本轻松地进行转换,例如 <http://www.foo.org/triple1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.foo.org/Human> 它是准确的,正如我所希望的那样。但是对于像这样复杂

我有一个N-Triples转储,我想将其转换为Cypher文本,这样就可以直接加载到Neo4j数据库中。 对于像
rdf syntax ns#type
这样的简单本体,我可以使用脚本轻松地进行转换,例如

<http://www.foo.org/triple1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.foo.org/Human>
它是准确的,正如我所希望的那样。但是对于像
这样复杂的东西,它会变得很糟糕

因此,我的问题是如何使用
作为谓词将任何三元组转换为Cypher文本?

有关如何将RDF转换为Neo4J的一般问题,请参阅

特别是对于
equivalentProperty
之类的东西,你在这里搞砸的原因是
equivalentProperty
是一个引用模型本身的“元”语句;也就是说,在本例中,它是关于属性而不是数据的声明。在Neo4J中,数据库中没有明确的模型(我们希望这可能会随着时间的推移而改变,但目前情况就是这样)。所以你不能把财产说成是这样。您最好的选择可能是创建一种新的节点来代表该属性元数据

例如,如果您有RDF:

<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#equivalentProperty> <http://my-ns.org/vocab#foobar>

这样做之所以有效,是因为我们正在创建使属性元数据成为真实的
:Property
节点。默认情况下,neo4j无法做到这一点,而在RDF中,由于这些属性有自己的URI,因此它们在RDF中是“节点”。

感谢buddy的回答,即使是
sameAs
hasType
这样的小东西,neo4j也会变得很糟糕。可悲的是,这些东西将进入ACM的论文提交,在其中他们进入各种各样的细节。我已经采纳了你的建议,正在运行脚本。一旦答案正确,我就认为它是准确的。再次感谢。类似于
sameAs
的东西也会因为同样的原因出现同样的问题。SameAs将一个模型项标记为与另一个相同。可以说,你必须“为模型建模”。是的,希望Neo4j团队能想出更多的方法来处理这些事情。另请参见我对另一个相关问题的回答:也许吧。
equivalentProperty
背后的前提是,您有两个来自不同名称空间的不同道具。总的来说,我认为合并它们是个坏主意,因为这样会破坏这两种声音之间的区别。这可能还可以,这取决于您的用例,但RDF有充分的理由将它们分开。请注意,在我建议的属性中,我添加了一个
ns
属性,这样即使两个属性的名称相同,也可以区分它们之间的差异。合并将破坏这种差异。因此,这最终取决于您是否需要按名称空间进行区分。
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#equivalentProperty> <http://my-ns.org/vocab#foobar>
MERGE (p1:Property { ns: "http://www.w3.org/1999/02/22-rdf-syntax-ns#", name:"type" },
      (p2:Property { ns: "http://my-ns.org/vocab#", name: "foobar" }),
      (p1)-[:equivalentProperty]->(p2);