我有一个SPARQL查询,用于检索与另一个特定类的实例相邻的特定类的所有实例。例如:
class FileUploadListener
{
private $uploader;
public function __construct(FileUploader $uploader)
{
$this->uploader = $uploader;
}
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$this->uploadFile($entity);
}
public function preUpdate(PreUpdateEventArgs $args)
{
$entity = $args->getEntity();
$this->uploadFile($entity);
}
private function uploadFile($entity)
{
//Tried a lot of combinations with foreach, but not working :(
if (!$entity instanceof Product) {
return;
}
$file = $entity->getImages();
// only upload new files
if (!$file instanceof UploadedFile) {
return;
}
$fileName = $this->uploader->upload($file);
$entity->setImages($fileName);
}
}
让我们说上述查询的结果如下所示:
SELECT ?origin ?dependent WHERE {
?origin a :type1 .
?origin ?somePredicate ?dependent.
?dependent a :type2 .
}
因此,在这种情况下,指定类型的两个节点连接到?origin ?dependent
node1 node3
node1 node4
node2 node5
node2 node6
和node1
。现在,我想将结果限制为那些node2
结果,其中这两个节点中的至少一个不是特定三元组的主题,但是在它们中只有一个具有三元组的情况下仍然返回两者
让我们说图中存在以下三元组:
?dependent
假设node4 :isSubjectOf :thisTriple .
node5 :isSubjectOf :thisTriple .
node6 :isSubjectOf :thisTriple .
是节点3-6中唯一没有此特定三元组的节点。现在,我想写一个查询,让我的结果集看起来像这样:
node3
我希望我能够很好地理解这个问题。是否有一些方便有效的SPARQL技术来完成这样的事情?如果可能,我宁愿避免使用?origin ?dependent
node1 node3
node1 node4
。
答案 0 :(得分:3)
这是我设想您的数据的方式:
@prefix ns0: <http://example.com/> .
<http://example.com/node1>
a <http://example.com/type1> ;
ns0:somePredicate ns0:node3, ns0:node4 .
ns0:node2
a ns0:type1 ;
ns0:somePredicate ns0:node5, ns0:node6 .
ns0:node3
a ns0:type2 ;
ns0:isSubjectOf ns0:thisTriple .
ns0:node4 a ns0:type2 .
ns0:node5 a ns0:type2 .
ns0:node6 a ns0:type2 .
这是一个获得您要求的查询。只要为绑定它们的谓词使用不同的变量名,就可以在同一主题和同一对象之间创建不同的三元模式。
PREFIX : <http://example.com/>
SELECT ?origin ?dependent
WHERE
{ ?origin a :type1 ;
?somePredicate ?dependent .
?dependent a :type2 .
?origin ?anyPred ?theSubj .
?theSubj :isSubjectOf ?theTrip
}
结果:
+--------+-----------+
| origin | dependent |
+--------+-----------+
| :node1 | :node3 |
| :node1 | :node4 |
+--------+-----------+