我有一个N-Triples的转储,我想将其转换为Cypher Text,以便可以直接将其加载到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>
可以轻松转换为
CREATE (t1:Human { type : "triple1" })
它是准确的,正如我想要的那样。但是对于像<http://www.w3.org/2002/07/owl#equivalentProperty>
这样复杂的东西,它会变得非常糟糕。
因此,我的问题是如何使用 <http://www.w3.org/2002/07/owl#equivalentProperty>
作为谓词将任何三元组转换为 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>
然后你可以把它变成:
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);
这样做的原因是我们正在创建:Property
节点,使属性元数据成为现实。 默认情况下,neo4j不会得到这一点,而在RDF中,由于这些属性具有自己的URI,因此它们是RDF中的"节点"。