Выбор значений из rdflib - PullRequest
1 голос
/ 29 мая 2020

Я новичок в rdflib, и я использую его для выполнения запросов к простому файлу черепахи, данные, которые я анализирую, выглядят следующим образом

<http://www.siemens.com/ai/plant/data/PolishingStation1> a ns1:Station a ns1:MaterialFlowObject; ns1:hasName "PolishingStation1" . <http://www.siemens.com/ai/plant/data/PolishingStation2> a ns1:Station a ns1:MaterialFlowObject; ns1:hasName "PolishingStation2" . <http://www.siemens.com/ai/plant/data/QuenchingStation1> a ns1:Station a ns1:MaterialFlowObject; ns1:hasName "QuenchingStation1" . <http://www.siemens.com/ai/plant/data/QuenchingStation2> a ns1:Station a ns1:MaterialFlowObject; ns1:hasName "QuenchingStation2" . <http://www.siemens.com/ai/plant/data/QuenchingStation3> a ns1:Station a ns1:MaterialFlowObject; ns1:hasName "QuenchingStation3" . <http://www.siemens.com/ai/plant/data/QuenchingStation4> a ns1:Station a ns1:MaterialFlowObject; ns1:hasName "QuenchingStation4" .

и запрос выглядит следующим образом следует

`SELECT? name? type From WHERE {

?MaterialFlowObject a ns1:Drain.
?MaterialFlowObject a ?type.
?MaterialFlowObject ns1:hasName ?name.
#?Parameter ns1:hasParameter    ?parameters .

}`

проблема в том, что когда я получаю тип, я получаю 2 значения для каждой переменной, и я не могу разделите их вообще, код, который я использую

kg = ConjunctiveGraph() input_ontology_path = "./plant_data.ttl" kg.parse(input_ontology_path, format="ttl")

with open("queries/get_Material_Flow.rq") as f: sparql_query_string = f.read() query_output = kg.query(sparql_query_string) for row in query_output: d = str( (row['type'] )) s = d.split('#')[-1] print(s) # pprint.pprint(row)

Результат, который я получаю, всегда представляет собой строку, содержащую оба значения Drain MaterialFlowObject в одной строке, и я не могу разделить их с помощью разделенной строки или чего-то еще, все, что мне нужно, это получить Drain в переменной, отличной от MaterialFlowObject, все равно есть

1 Ответ

0 голосов
/ 29 мая 2020

С исправленными файлами примеров:

plant_data.ttl:

@prefix ns1: <tag:a#> .

<http://www.siemens.com/ai/plant/data/PolishingStation1>
    a ns1:Station;
    a ns1:MaterialFlowObject;
    ns1:hasName "PolishingStation1" .
...

get_Material_Flow.rq:

PREFIX ns1: <tag:a#>

SELECT ?name ?type 
WHERE {
  ?MaterialFlowObject a ns1:Station.
  ?MaterialFlowObject a ?type.
  ?MaterialFlowObject ns1:hasName ?name.
}

run_query.py:

from rdflib.graph import ConjunctiveGraph

kg = ConjunctiveGraph() 
input_ontology_path = "./plant_data.ttl" 
kg.parse(input_ontology_path, format="ttl")

with open("get_Material_Flow.rq") as f:
    sparql_query_string = f.read() 
    query_output = kg.query(sparql_query_string) 
    for row in query_output: 
        print(f'name={str(row["name"])},type={str(row["type"])}')

Это работает, как ожидалось, и дает результат для каждого совпадения:

name=PolishingStation1,type=tag:a#Station
name=PolishingStation1,type=tag:a#MaterialFlowObject
name=QuenchingStation3,type=tag:a#MaterialFlowObject
name=QuenchingStation3,type=tag:a#Station
name=QuenchingStation4,type=tag:a#Station
name=QuenchingStation4,type=tag:a#MaterialFlowObject
name=PolishingStation2,type=tag:a#MaterialFlowObject
name=PolishingStation2,type=tag:a#Station
name=QuenchingStation2,type=tag:a#MaterialFlowObject
name=QuenchingStation2,type=tag:a#Station
name=QuenchingStation1,type=tag:a#MaterialFlowObject
name=QuenchingStation1,type=tag:a#Station
...