Kineo

一个持久化的 RDF 四元组存储和 SPARQL 引擎

构建

swift build -c release

Swift 包管理器

您可以使用 Swift 包管理器,通过将其作为依赖项添加到 Package.swift 中,将 Kineo 添加到 Swift 项目中

.package(name: "Kineo", url: "https://github.com/kasei/kineo.git", .upToNextMinor(from: "0.0.91")),

加载数据

创建一个数据库文件 (geo.db) 并加载一个或多个 N-Triples 或 Turtle 文件

% ./.build/release/kineo -q geo.db -d examples/geo-data/geo.ttl load

指定 -d FILENAME 将从 FILENAME 加载数据到默认图。或者,可以将数据加载到特定的命名图(同样,可以使用自定义图名称作为查询默认图)

% ./.build/release/kineo -q geo.db -g http://example.org/dbpedia examples/geo-data/geo.ttl load

查询

可以使用 SPARQL 查询数据

% cat examples/geo-data/geo.rq
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
SELECT  ?s
WHERE {
	?s geo:lat ?lat ;
	   geo:long ?long ;
	FILTER(?long < -120)
	FILTER(?lat >= 34.0)
	FILTER(?lat <= 35.0)
}
ORDER BY ?s

% ./.build/release/kineo -q geo.db query examples/geo-data/geo.rq
Using default graph <file://examples/geo-data/geo.ttl>
1	Result[s: <http://dbpedia.org/resource/Buellton,_California>]
2	Result[s: <http://dbpedia.org/resource/Lompoc,_California>]
3	Result[s: <http://dbpedia.org/resource/Los_Alamos,_California>]
4	Result[s: <http://dbpedia.org/resource/Mission_Hills,_California>]
5	Result[s: <http://dbpedia.org/resource/Orcutt,_California>]
6	Result[s: <http://dbpedia.org/resource/Santa_Barbara_County,_California>]
7	Result[s: <http://dbpedia.org/resource/Santa_Maria,_California>]
8	Result[s: <http://dbpedia.org/resource/Santa_Ynez,_California>]
9	Result[s: <http://dbpedia.org/resource/Solvang,_California>]
10	Result[s: <http://dbpedia.org/resource/Vandenberg_Air_Force_Base>]

Kineo API

Kineo API 可用于创建内存或持久化四元组存储,将 RDF 数据加载到其中,并评估数据上的 SPARQL 查询

import Foundation
import SPARQLSyntax
import Kineo

let graph = Term(iri: "http://example.org/default-graph")
let store = MemoryQuadStore()

let url = URL(string: "http://kasei.us/about/foaf.ttl")!
try store.load(url: url, defaultGraph: graph)

let sparql = "PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT * WHERE { ?person a foaf:Person ; foaf:name ?name }"
let q = try SPARQLParser.parse(query: sparql)
let results = try store.query(q, defaultGraph: graph)
for (i, result) in results.bindings.enumerated() {
    print("\(i+1)\t\(result)")
}

还有一个 API 可以通过图顶点和边遍历来暴露 RDF 数据

import Foundation
import SPARQLSyntax
import Kineo

let graph = Term(iri: "http://example.org/default-graph")
let store = MemoryQuadStore()

let url = URL(string: "http://kasei.us/about/foaf.ttl")!
try store.load(url: url, defaultGraph: graph)

let graphView = store.graph(graph)
let greg = graphView.vertex(Term(iri: "http://kasei.us/about/#greg"))

let knows = Term(iri: "http://xmlns.com/foaf/0.1/knows")
let name = Term(iri: "http://xmlns.com/foaf/0.1/name")
for v in try greg.outgoing(knows) {
    let names = try v.outgoing(name)
    if let nameVertex = names.first {
        let name = nameVertex.term
        print("Greg know \(name)")
    }
}

SPARQL 终结点

最后,使用配套的 kineo-endpoint 包,可以运行 SPARQL 终结点,允许 SPARQL 协议客户端访问数据

% kineo-endpoint -q geo.db &
% curl -H "Accept: application/sparql-results+json" -H "Content-Type: application/sparql-query" --data 'PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> SELECT ?s ?lat ?long WHERE { ?s geo:lat ?lat ; geo:long ?long } LIMIT 3' 'https://:8080/sparql'
{
  "head": {
    "vars": [ "s", "lat", "long" ]
  },
  "results": {
    "bindings": [
      {
        "s": { "type": "uri", "value": "http://dbpedia.org/resource/'s-Gravendeel" },
        "lat": { "type": "literal", "value": "5.17833333333333E1", "datatype": "http://www.w3.org/2001/XMLSchema#float" },
        "long": { "type": "literal", "value": "4.61666666666667E0", "datatype": "http://www.w3.org/2001/XMLSchema#float" }
      },
      {
        "s": { "type": "uri", "value": "http://dbpedia.org/resource/'s-Hertogenbosch" },
        "lat": { "type": "literal", "value": "5.17833333333333E1", "datatype": "http://www.w3.org/2001/XMLSchema#float" },
        "s": { "type": "uri", "value": "http://dbpedia.org/resource/Groesbeek" },
        "long": { "type": "literal", "value": "5.93333333333333E0", "datatype": "http://www.w3.org/2001/XMLSchema#float" }
      },
      {
        "s": { "type": "uri", "value": "http://dbpedia.org/resource/'s-Hertogenbosch" },
        "lat": { "type": "literal", "value": "5.1729918E1", "datatype": "http://www.w3.org/2001/XMLSchema#float" },
        "long": { "type": "literal", "value": "5.306938E0", "datatype": "http://www.w3.org/2001/XMLSchema#float" }
      }
    ]
  }
}