将JSON-LD插入Neo4j的语义正确方法是什么?

时间:2015-03-17 12:34:24

标签: database database-design graph neo4j

例如,以下是我要插入的两个链接节点:

{
  "@context": "http://schema.org",
  "@id": "some_organization_id",
  "@type": "Organization",
  "name": "Some Awesome Company",
  "image": [
     "http://someawesomecompany.com/logo.jpg",
     { "@id": "some_image_id" }
  ]
}

{
  "@context": "http://schema.org",
  "@id": "some_image_id",
  "@type": "ImageObject",
  "contentUrl": "http://instagram.com/blahblah",
  "thumbnail: "...",
  "caption: "..."
}

注意属性“image”如何包含多个对象,可以是文本或指向其他节点。

Neo4j似乎区分了“属性”和“关系”。在Neo4j或类似的图形数据库中是否存在一种方式,其中关系和属性是同一个东西,并且属性的值可以指向另一个节点?

2 个答案:

答案 0 :(得分:2)

在Neo4j中,关系本身就是对象,可以包含自己的属性。

没有什么可以阻止您在属性中保留对另一个节点的引用,但不建议这样做,因为数据库会为您跟踪。

使用Neo4j作为示例,您可以使用图像创建其他节点,只需在组织节点和图像节点之间创建关系。

如果您需要有关特定节点关系的信息,可以通过ReST接口获得大量详细信息,尽管JSON对象中返回的多个属性描述了该节点的关系。

"outgoing_relationships": "http://localhost:7474/db/data/node/1/relationships/out"
"all_typed_relationships": "http://localhost:7474/db/data/node/1/relationships/all/{-list|&|types}"
"outgoing_typed_relationships": "http://localhost:7474/db/data/node/1/relationships/out/{-list|&|types}"
"incoming_relationships": "http://localhost:7474/db/data/node/1/relationships/in"
"create_relationship": "http://localhost:7474/db/data/node/1/relationships"
"all_relationships": "http://localhost:7474/db/data/node/1/relationships/all"
"incoming_typed_relationships": "http://localhost:7474/db/data/node/1/relationships/in/{-list|&|types}   

同样,对于关系,JSON文档中有一些属性可以描述连接到关系的起始节点和结束节点。

"start": "http://localhost:7474/db/data/node/2"
"end": "http://localhost:7474/db/data/node/22"

答案 1 :(得分:2)

像Neo4j这样的图形数据库非常接近于面向对象的模型,它也很好地代表了真实世界的信息。

有些属性本身属于实体,如名称,大小,年龄,描述。

然后存在语义关系,例如知道拥有工作在生活在包含,用于捕获实体之间的连接。

对于大多数人来说,这种模型比完全规范化的RDF模型和(可能)JSON-LD更容易理解和处理。

但是根据域名(本体论),它应该是非常简单的(具有常识,域和用例的知识)来决定什么应该成为真正的关系,什么只是一个节点上的属性或属性。