2015-03-09 3 views
1

Я новичок в SPARQL, и я хотел бы объединить два столбца в одинSPARQL комбинат - сцепить две колонки в одну

исходной таблицы

a|b|1 
c|d|2 

хотел таблица

a|b 
c|d 
b|1 
d|2 

его, как создание двух разных таблиц и помещение их друг на друга.

Мне нужно, чтобы сделать визуализацию с помощью d3sparql, которая принимает эту форму данных, я также хочу импортировать json и модифицировать его, а затем распечатать его на экране, но если это возможно, это упростит и ускорит работу. .


UPDATE: Мой первоначальный запрос выглядит, что

PREFIX prefix1:<...> 
PREFIX prefix2:<...> 
SELECT ?x ?y ?z 
WHERE { 
?x prefix1:OwnsY ?y. 
?y prefix1:PublishesZ ?z. 
} 
+0

Каков был ваш первоначальный запрос? Я думаю, вам просто нужно разделить оригинал на объединение, но немного сложно помочь, когда вы представляете его вот так. – user205512

+0

только что обновил вопрос, спасибо за вашу помощь :) – TheEnglishMe

+0

@ozama ли ваш набор данных содержит любое использование собственных или публикует там другие компоненты? То есть, вы просто хотите выбрать всех своих и опубликовать троек или хотите только? X и? Z, когда между ними есть * common * y? –

ответ

2

Самый простой способ (но не самым эффективным) является:

PREFIX prefix1:<...> 
PREFIX prefix2:<...> 
SELECT DISTINCT ?x ?z 
WHERE { 
    { ?x prefix1:OwnsY ?y. ?y prefix1:PublishesZ ?z. } 
    UNION 
    { ?x prefix1:OwnsY ?z. ?z prefix1:PublishesZ ?whatever. } 
} 

который в действительности выполняет запрос дважды.

+0

Это приведет к тому, что исходный запрос будет получен, но на основе [комментария ozama] (http://stackoverflow.com/questions/28943956/sparql-combine-concatenate-two-columns-into -one? noredirect = 1 # comment46145119_28943956), похоже, что исходный запрос может быть слишком строгим. –

1

Если вы просто пытаетесь извлечь все предметы и объекты принадлежат и опубликованы троек, то это может быть очень простой запрос. Если, с другой стороны, вам нужны только данные, где есть все три части, вам нужен полный союз. Давайте создадим несколько примеров данных и посмотреть, что мы можем сделать:

@prefix : <urn:ex:> 

:a :owns :b . 
:b :publishes 1 . 

:c :owns :d . 
:d :publishes 2 . 

:e :owns :f . # no corresponding :publishes 

:g :publishes :h . # no corresponding :ownsprefix : <urn:ex:> 

Вот ваш текущий запрос и результаты:

select ?x ?y ?z { 
    ?x :owns ?y . 
    ?y :publishes ?z . 
} 

--------------- 
| x | y | z | 
=============== 
| :a | :b | 1 | 
| :c | :d | 2 | 
--------------- 

Теперь, если вы готовы, чтобы получить те, владеет и публикует тройки, которые не имеют соответствующей публикации и владеют тройками, вы можете использовать объединение, блок ценностей или путь собственности. Союз будет

{ ?x :owns ?y } union { ?x :publishes ?y } 

значения блок будет будет немного проще:

values ?p { :owns :publishes } 
?x ?p ?y 

Вы можете сделать это еще проще с пути свойства:

?x :owns|:publishes ?y 

Все это даст вам :

----------- 
| x | y | 
=========== 
| :a | :b | 
| :b | 1 | 
| :c | :d | 
| :d | 2 | 
| :e | :f | * owns 
| :g | :h | * publishes 
----------- 

Обратите внимание, что строки со звездами присутствуют, потому что «e владеет f» и «g публикует h», хотя нет ничего, что опубликовано, и ничего, что принадлежит g. Ваш исходный запрос не найдет их. Если вам нужно исключить своих владельцев и опубликовать троек, которые не публикуются и не имеют собственных копий, вам необходимо использовать опцию union, которая включает все части, как в user205512's answer.

+1

Это не эквивалентно. Запрос требует, чтобы x владела y * и * y публикует z, тогда как вы использовали a или. – user205512

+0

Это очень хороший момент; это заберет принадлежащие вещи, которые ничего не опубликовали, и опубликовали вещи, которые не принадлежат. –

+0

@ user205512 Я обновил свой ответ, чтобы сделать это явным; это работает только в том случае, если целью является извлечение * обоих * типов троек, а не извлечение более сложной структуры. –

Смежные вопросы